此篇为个人学习所用。
LitePal是一个开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平常所用到的一些数据库功能进行了封装,使得不用编写一行SQL语句,就可以完成各种建表和增删改查的操作。
其开源地址:https://github.com/LitePalFramework/LitePal
具体接受和用法,我们可以访问以上链接查看。
LitePal配置
目前,我们要在android项目上即成开源库的话也是相当简单,大多数的开源项目都会提交到jcenter上,我们只需要在app/build.gradle文件中声明该开源库的引用就可以。
implementation 'org.litepal.android:java:3.0.0'
然后配置litepal.xml文件(在app/src/main目录下新建一个litepal.xml文件),并编辑内容为:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
//数据库名称
<dbname value = "BookStore"> </dbname>
// 数据库版本
<version value = "1"> </version>
//用于指定所有的映射模型
<list>
</list>
</litepal>
同时修改AndroidManifest.xml文件中的内容,<application>
下增加内容
android:name="org.litepal.LitePalApplication"
到此,所有的LitePal的配置工作都已经结束了。
数据库创建与升级
我们还拿上篇的一个例子。定义一个类Book类,继承自LitePalSupport,声明一些属性,并实现其getter和setter方法。
public class Book extends LitePalSupport{
private int id;
private String auther;
。。。。。。
public void setId(int id) {
this.id = id;
}
public void setAuther(String auther) {
this.auther = auther;
}
。。。。。。
public int getId() {
return id;
}
public String getAuther() {
return auther;
}
。。。。。。
}
其实Book类就对应一个Java bean。其实Book类就对应数据库当中的Book表。
然后我们修改litepal.xml文件,在list标签下增加:
<list>
<mapping class = "com.example.adiqueen.litepaltest.Book"></mapping>
</list>
这里使用<mapping>来声明我们要配置的映射模型类,注意一定要是完成的类名,不管有多少的模型类需要映射都适用同样的方式配置在list标签下即可。现在只要进行任何一次数据库相关的操作,BookStore.db数据库就会自动的创建出来。
然后触发一个事件调用Connector.getDatabase()方法,该方法就是一次简单的数据库操作,执行这个方法之后 BookStore数据库就创建完成了。
数据库的升级
如果数据库不能满足我们的需要了,需要作出改进。例如:Book类需要增加字段,或者需要增加一张别的表,在这里假设我们要增加一张Category的表。该怎么升级呢?
步骤很简单:
1、在Book类中增加相应的字段,创建类似于Book的Category类。
2、修改litepal.xml文件内容,将version表示的版本增加,list中添加映射关系。
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value = "BookStore"> </dbname>
<version value = "2"> </version>
<list>
<mapping class = "com.example.adiqueen.litepaltest.Book"></mapping>
<mapping class = "com.example.adiqueen.litepaltest.Category"></mapping>
</list>
</litepal>
使用LitePal实现数据库的增 删 改 查
其具体实现逻辑在此不作过多的叙述,直接看实现代码吧。
//增加数据
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book = new Book();
book.setName("C语言");
book.setAuther("Json");
book.setPages(330);
book.setPrice(39.9);
book.setPress("北京人民教育出版社");
book.save();//添加一条数据
/*
* 同一个bean存过一次后再存就会存储失败
* */
//对象是否存储过
//Boolean isSave = book.isSaved();
//book.saveAsync();//异步保存
//book.saveThrows();
//如果希望存储失败的话就抛出异常,而不是返回一个false,那就可以使用saveThrows()方法来代替。
//使用saveThrows()方法来存储数据,一旦存储失败就会抛出一个DataSupportException异常,我们可以通过对这个异常进行捕获来处理存储失败的情况。
//book.saveOrUpdate("name = ?" ,book.getName());//不存在就存储,已存在就更新的需求
}
});
//更新数据的另一种方式
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book = new Book();
//在这里调用setPrice()和setPress()来设置要更新的数据
//调用updateAll()方法来执行更新
book.setPrice(14.95);
book.setPress("Gagaga");
book.updateAll("name = ? and auther = ?" ,"数据结构","Liu Gaojian");
//如果我们想要把一个字段的值全部更新为默认值,可以使用一下方式
book.setToDefault("price");
book.updateAll();
//第一步,查找id为1的记录
Book book1 = LitePal.find(Book.class,1);
//第二步,改变某个字段的值
book1.setPages(300);
//保存数据
boolean isSaveSuccess= book1.save();
if (isSaveSuccess){
//修改完成
}else {
//修改失败
}
Book book2 = new Book();
book2.setName("操作系统");
//直接更新id为1的记录
book2.update(1);
boolean isSaveSu = book2.save();
if (isSaveSuccess){
//修改完成
}else {
//修改失败
}
Book book3 = new Book();
book3.setPress("HHHHHHHH");
//将所有name为C语言的数据,press全部改成HHHHHHHH
book3.updateAll("name = ?","C语言");
Book book4 = new Book();
book4.setPress("HHHHHHHH");
//将所有name为C语言的、pages为300数据,press全部改成HHHHHHHH
book4.updateAll("name = ? and pages = ?","C语言","300");
}
});
//删除数据数据
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//条件删除
LitePal.deleteAll(Book.class,"price < ?","15");
//返回值是int,表示删除了几条数据,返回0表示没有删除
//int isdelect= LitePal.deleteAll(Book.class);
}
});
//查询数据
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//通过id查询
Book book_ = LitePal.find(Book.class,1);
//查询全部
List<Book> books = LitePal.findAll(Book.class);
for (Book book : books){
Log.d("GGGGGGG",book.getName().toString());
}
//根据姓名查找,并按照某字段排序
List<Book> books_ = LitePal.where("name = ?","Liu gaojian").order("price").find(Book.class);
for (Book book : books_){
Log.d("GGGGGGG",book.getName().toString());
}
//查price小于30
List<Book> book_s_ = LitePal.where("price < ?","30").find(Book.class);
for (Book book : book_s_){
Log.d("GGGGGGG",book.getName().toString());
}
}
});