配置
- 配置LitePal,编辑app/build.gradle文件,在dependencies闭包中添加
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
// 添加的是这一句话
compile 'org.litepal.android:core:1.3.2'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
- 配置litepal.xml文件,右击app/src/main new-->Directory,创建一个assets目录,在这个目录下创建一个litepal.xml文件,编辑里面的内容
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value="BookStore"></dbname>
<version value="1"> </version>
<list></list>
</litepal>
- 其中<dbname>是只定数据库名,<version>是指定数据库版本号,<list>是用于指定所有的映射模型
- 还需要配置LitePalApplication,修改AndroidMainfest.xml中的代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.md.li">
<application
// 指定这一句话
android:name="org.litepal.LitePalApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
...>
...
</application>
</manifest>
创建和升级数据库
- 定义一个Book类
public class Book {
private int id;
private String price;
private int pages;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public int getPages() {
return pages;
}
public void setPages(int pages) {
this.pages = pages;
}
}
- 这就是一个典型的javaBean,Book类就会对应数据库中的Book表,类中的每一个字段对应着表中的每一列,这就是对象关系映射
- 修改litepal.xml中的代码
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value="BookStore"></dbname>
<version value="1"></version>
<list>
<mapping class="com.example.md.li.Book"></mapping>
</list>
</litepal>
- 使用<mapping>标签来声明要配置的映射模型类,这里要使用完整的类名,不管有多少个模型类需要映射,都用同样的方式配置在<list>中就可以了
- 现在只要进行任意一次数据库的操作,这个BookStore数据库就会自动创建,在MainActivity中修改代码,布局界面就不显示了
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button createDatabases = (Button)findViewById(R.id.carete_database);
createDatabases.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Connector.getDatabase();
}
});
}
}
- 点击按钮的时候调用
Connector.getDatabase()
方法,数据库就自动的创建完成, -
查看adb shell,命令和上一节的一样 sqlite3 .schema
- 这操作比前面的那个简单多了,升级版本更加的简单,把你想该的内容该完,然后将版本好加1就可以了,例如在Book表中添加一个字段press(出版社),直接修改Book类中的代码
public class Book {
private String press;
...
public String getPress() {
return press;
}
public void setPress(String press) {
this.press = press;
}
}
- 这个时候还想添加一张表,只要新建一个Category就可以了
public class Category {
private int id;
private String categoryName;
private int categoryCode;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
public int getCategoryCode() {
return categoryCode;
}
public void setCategoryCode(int categoryCode) {
this.categoryCode = categoryCode;
}
}
- 该完想改的东西都,只需要在版本号后面加上1就可以了,修改litepal.xml中代码
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value="BookStore"></dbname>
<version value="2"></version>
<list>
<mapping class="com.example.md.li.Book"></mapping>
<mapping class="com.example.md.li.Category"></mapping>
</list>
</litepal>
-
点击按钮重新运行程序,你会发现
添加数据
只需要创建创建出模型的实例,再将所有要存储的数据设置好,最后调用save()即可
但是,要操作数据的时候(增删查改),把模型类继承自DataSupport类
才可以,
- 修改Book类的代码
public class Book extends DataSupport{
...
}
- 点击按钮的时候添加数据
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button createDatabases = (Button)findViewById(R.id.carete_database);
createDatabases.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book = new Book();
book.setName("The Da Vinci Code");
book.setPages(454);
book.setPrice("18.99");
book.setPress("Unknow");
book.save();
}
});
}
}
-
这都非常熟悉了,最后要save(),运行程序,点击按钮
更新数据
- 普通更新
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button updateData = (Button)findViewById(R.id.updata_data);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book = new Book();
book.setName("The Lost Symbol");
book.setPages(511);
book.setPrice("20");
book.setPress("Unknow");
book.save();
book.setPrice("30");
book.save();
}
});
}
}
- 先添加一条数据,然后调用setPrice()方法把这本书的价格进行修改,之后又调用了save()方法,此时LitePal对发现当前的Book对象是已存储的,因此不会向数据库中添加一条新的数据,而是会直接更新当前的数据
-
运行程序可以看到
新增了一条信息,但是书的price值并不是一开始设置的20,而是30,说你更新有效,但是这样不方便
- 灵巧更新
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button updateData = (Button)findViewById(R.id.updata_data);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book = new Book();
book.setPrice("50");
book.setPress("Anchor");
book.updateAll("name=?and pages = ?","The Lost Symbol","511");
}
});
}
}
- 调用set方法设置需要更新的数据,最后调用updateAll()方法执行更新操作,这个方法还可以指定条件约束,不指定的话就是所有
-
运行程序,发现条件成立的都被更新了
- 在使用updateAll()方法的时候,还有一点要知道的,那就是当你想把一个字段的值更新成默认值的时候,是不可以用set方式的,LitePal提供了一个setToDefault()方法,然后传入对应的列名就可以实现了
Book book = new Book();
book.setToDefault("pages");
book.updateAll();
- 这段代码是指把所有的页数都更新成0
删除数据
Button updateData = (Button)findViewById(R.id.updata_data);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DataSupport.deleteAll(Book.class,"price < ?","20");
}
});
- 这里使用DataSupport.deleteAll()进行删除数据,第一个参数用于指定删除那张表中的数据,第二个是约束的条件,删除价格小于20的
- 若deleteAll()不指定参数的话,就全部删除
查询数据
使用一行代码足已
List<Book> books = DataSupport.findAll(Book.class)
这里只需要了用findAll()方法就可以了,里面传入的要查询的那张表
- 修改MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button queryButton = (Button)findViewById(R.id.query_data);
queryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
List<Book> books = DataSupport.findAll(Book.class);
for(Book book:books){
Log.d("MainActivty","name "+book.getName());
Log.d("MainActivty","press "+book.getPress());
Log.d("MainActivty","price "+book.getPrice());
Log.d("MainActivty","pages "+book.getPages());
}
}
});
}
}
-
findAll()方法获取到全部,然后遍历集合就可以了
- 当然了,还有一些操作
心累