LitePal是一款开源的Android数据库框架,采用了对象关系映射的模式。
LitePal的项目主页上有详细的使用文档,地址为http://github.com/LitePalFramework/LitePal。
配置LitePal
- 在app/buile.gradle文件中声明该开源库的引用。
在dependencies闭包中添加该内容
compile 'org.litepal.android:core:1.6.1'
- 配置litepal.xml文件。
右击app/src/main目录–>New–>Floder–>AssetFloder,创建一个assets目录,然后在assets目录下新建一个litepal.xml文件。
关于建立litepal.xml文件,我真的用了挺久(笑哭),先右击assets,选择New Resource Diectory新建litepal.xml,然后这个xml文件就出现在了res目录下的layout(就是这么dt),然后我就把它强行拉到了assets目录下(卑微)
编辑litepal.xml
- dbname标签用于指定数据库名
- version标签用于指定数据库版本号
- list标签用于指定所有的映射模式
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value = "BookStore"></dbname>
<version value = "1"></version>
<list></list>
</litepal>
- 配置LitePalApplication
在AndroidMainfest.xml的application中添加以下内容,让LitePal的所有功能可正常工作。
android:name="org.litepal.LitePalApplication"
创建和升级数据库
创建
- 编辑activity_main.xml
也就是创建、添加、更新、删除、查询数据库的按钮。
<Button
android:id="@+id/creat_database"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Creat database"/>
<Button
android:id="@+id/add_database"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add database"/>
<Button
android:id="@+id/updata_database"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Updata database"/>
<Button
android:id="@+id/delet_database"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Delet_database"/>
<Button
android:id="@+id/query_database"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Query database"/>
- 执行建表语句,定义Book类。
这是一个典型的Java bean。
Book类就会对应数据库中的Book表,而类中的每一个字段分别对应表中的每一个列。
package com.example.litepaltest;
/**
* Created by lenovo on 2019/6/11.
*/
public class Book {
private int id;
private String author;
private double price;
private double pages;
private String name;
public void setId(int id){
this.id = id;
}
public void setAuthor(String author){
this.author = author;
}
public void setPrice(double price){
this.price = price;
}
public void setPages(double pages){
this.pages = pages;
}
public void setName(String name){
this.name = name;
}
public int getId(int id){
return this.id;
}
public String getAuthor(String author){
return this.author;
}
public double getPrice(double price){
return this.price;
}
public double getPages(double pages){
return this.pages;
}
public String getName(String name){
return this.name;
}
}
- 将Book类添加到映射模型列表中。
修改litepal.xml。
mapping标签声明我们要配置的映射模型类,一定要使用完整类名。
<list>
<mapping class = "com.example.litepaltest.Book"></mapping>
</list>
- 修改MainActivity代码,进行任意一次数据库操作。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button)findViewById(R.id.creat_database);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Connector.getDatabase();//一次最简单的操作
}
});
}
升级
只需要改你想改的任何内容,然后将版本号加一。
- 修改内容。
比如想象Book表中添加出版社press列,直接修改Book类中的代码。
...
private String press;
...
public void setPress(String press){
this->press = press;
}
...
poublic String getPress(){
return this->press;
}
比如还想再一个Category表,只需新建一个Category类就可以。
- 修改litepal.xml。
<version value = "2"></version>
<list>
<mapping class = "com.example.litepaltest.Book"></mapping>
<mapping class = "com.example.listpal.category"></mapping>
</list>
添加数据
只需要创建出模型类的实例,再将所有要存储的数据设置好,之后调用save()方法即可。
-
让Book继承DataSupport。
LitePal进行CRUD操作时必须继承DataSuport类。
save()方法来自DataSupport类。 -
向Book表中添加数据,修改MainActivity.
//添加数据
Button button1 = (Button)findViewById(R.id.add_database);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book = new Book();
book.setId(1);
book.setAuthor("马克.李维");
book.setName("偷影子的人");
book.setPages(500);
book.setPrice(35.5);
book.save();//数据添加操作,save()方法继承自DataSupport
}
});
更新数据
方式一:对已存储的对象重新设值,然后重调save()方法。
已存储对象:对于LitePal来说,对象是否存储根据调用**model.isSaved()**方法的结果来判断,返回true表示已存储。
model.isSaved()返回true:已调用过model.save()方法添加数据;model对象是通过LitePal提供的API查出来的(暂时通过第一种情况验证)。
//更新数据
Button button2 = (Button)findViewById(R.id.updata_database);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book = new Book();
book.setId(2);
book.setAuthor("麦克福尔");
book.setName("摆渡人");
book.setPages(700);
book.setPrice(46.7);
book.save();
book.setPrice(30.0);
book.save();
}
});
在第二次调用save()方法时,LitePal会发现当前对象已存储,不会再向数据库中添加一条数据,而是更新数据。
方式二:首先new出一个Book实例,然后直接调用具体方法设置要更新的数据,最后调用updataAll()执行更新操作。
//更新数据
Button button2 = (Button)findViewById(R.id.updata_database);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book = new Book();
book.setPrice(28.6);
book.updateAll("name = ? author = ?","偷影子的人","马克.李维");//如果不指定条件语句,就默认更新所有数据
}
});
使用updataAll()方法将数据更新为默认值:不能直接将值设为0或null或false等,而是使用**setToDefault()**方法,传入相应的列名。
例:
Book book = new Book();
book.setToDefault("pages");
book.updataAll();
删除数据
方式一:已存储数据直接调用delet()方法。
方式二:DataSupport.deleteAll()方法,第一个参数指定删除哪张表的数据,后面参数用于指定约束条件。
//删除数据
Button button3 = (Button)findViewById(R.id.delet_database);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DataSupport.deleteAll(Book.class,"price < ?","15");//删除Book表中价格低于15的书
}
});
查询数据
- 查询表中所有数据------finaAll()方法:参数用来指定查询哪个表,返回值是一个List集合。
例:查询Book表中的所有数据。
List<Book> books = DataSupport.findAl(Book.class);
- 查询表中第一条数据----findFirst()
Book firstBook = DataSupport.findFirst(Book.class);
- 查询表中最后一条数据----findLast()
Book findLast = DataSupport.findLast(Book.class);
- 通过连缀查询指定更多的查询功能
select():指定查询哪几列
List<Book> books = DataSupport.select("name","author").find(Book.class);//只查name和author这两列数据
where():指定查询的约束条件
List<Book> books = DataSupport.where("pages>?","400").find(Book.class);//只查页数大于400的数据
order():指定结果的排序方式,desc表示降序排列,asc或者不写表示升序排列
List<Book> books = DataSupport.order("price desc").find(Book.class);//查询结果按书价从高到低排序
limit():指定查询结果的数量
List<Book> books = DataSupport.limit(3).find(Book.class);
offest():指定查询结果的偏移量
List<Book> books = DataSupport.limit(3).dffset(1).find(Book.class);//查询表中的第2、3、4条