数据库存储之LitePal
LitePal是一款开源的Android数据库框架,其采用了对象关系映射(ORM)的模式,并将平时开发最常用的一些数据库功能进行了封装,使得不用编写一行SQL语句也可以完成各种建表和CRUD操作。
Github地址:https://github.com/LitePalFramework/LitePal
一.配置数据库
编辑build.gradle文件,在dependecies闭包中添加一下内容,其中的3.0.0为LitePal的版本,最新版本上LitePal的github上查看。
implementation 'org.litepal.guolindev:core:3.2.3'
配置litepal.xml文件。在app/src/main/assets目录下(若assets目录不存在,则创建),创建litepal.xml文件,编辑该文件如下。
<litepal>
<dbname value="BookStore" ></dbname>
<version value="1"></version>
<list>
</list>
</litepal>
< dbname > 标签用于指定数据库名,< version >标签用于指定数据库版本号,
< list >标签用于指定所有的映射模型。
最后需要配置一下AndroidManifest.xml,配置application为org.litepal.LitePalApplication,这样才能让LitePal的所有功能都可以正常工作。
<application
android:name="org.litepal.LitePalApplication"
...
</application>
二.创建和升级数据库
LitePal采取的是对象关系映射(ORM)的模式,简单的来说,我们使用的编程语言是面向对象语言,使用的数据库则是关系型数据库,那么将面向对象的语言与面向关系的数据库之间建立一种映射关系,就是对象关系映射。
定义一个Book类如下,其中定义了id、author、price以及name变量,并生成对应的getter和setter方法。
public class Book extends LitePalSupport {//进行CRUD时需要继承LitePalSupport类
private int id;
private String author;
private double price;
private String name;
//getters and setters
}
Book类即对应数据库中Book数据表,而类中的每个字段对应表中的每一列。
将Book类添加到映射模型列表当中,修改litepal.xml如下。
<list>
<mapping class="com.example.holidaytest.Book"></mapping>
</list>
调用LitePal的getDatabase()方法,数据库在不存在的情况下会被自动创建。
LitePal.getDatabase();//创建数据库
不同于SQLite的升级方式,LitePal对数据库的升级,只需要将litepal.xml中的version标签中的value即版本号进行叠加,LitePal会自动升级。
而值得注意的是,SQLite中通过onUpgrade()方法的升级会删除原本数据库中的所有数据,而LitePal保留之前表中的所有数据,从而避免了数据丢失的问题。
三.添加数据
使用LitePal添加数据,只需要创建模型类的实例,再将所有存储的数据设置好,调用**save()**方法即可插入数据,例子如下:
Book book = new Book();
book.setName("The Three Country");
book.setAuthor("ljh");
book.setPrice(888);
book.save();
四.更新数据
LitePalSupport提供了updateAll() 方法用于更新。更新例子如下
Book book = new Book();
book.setPrice(555);
book.setAuthor("Tom");
book.updateAll("name = ? and price > ?", "The Three Country", "666");
updateAll()方法可以指定一个条件约束,与SQLite中的update()方法的where参数部分有点类似,但更为简洁,如果不指定条件语句的话,就表示更新所有数据。
当需要把某个字段设置成默认值时,不可以使用set方式来设置数据,LitePal统一提供了一个setToDefault() 方法,传入相应的列名即可实现设置默认值。
Book book = new Book();
book.setToDefault("price");
book.updateAll();//更新全部数据的price
五.删除数据
使用LitePal提供的deleteAll() 方法。
LitePal.deleteAll(Book.class, "price > ?", "666");
deleteAll()方法第一个参数用于指定删除数据对应的表,其后的参数表示约束条件。另外,如果不指定条件,deleteAll()则会删除表中的所有数据。
六.查询数据
同样是查询数据,相比于SQLite的query()方法冗长的参数,LitePal提供了findAll()方法更为简洁,并且其返回的是List对象,方便操作,例子如下。
List<Book> books = LitePal.findAll(Book.class);
for (Book book1 : books) {
//operation
}
除了findAll()方法之外,LitePal还提供了其他的查询API,例如findFirst() 方法可用于查询第一条数据;findLast() 方法可用于查询最后一条数据。
而对于有条件的查询,LitePal提供了一系列的查询方法供使用:
select()方法用于指定查询哪几列的数据
where()方法用于指定查询的条件
order()方法用于指定结果的排序方式
limit()方法用于指定查询结果的数量
offset()方法用于指定查询结果的偏移量
通过使用以上方法,进行任意的连缀组合即可完成比较复杂的查询操作。
List<Book> books1 = LitePal.select("name", "author", "price")
.where("price > ?", "500")
.order("price")
.limit(10)
.offset(10)
.find(Book.class);
另外,如果上述API满足不了需求,LitePal还支持原生的SQL进行查询,如下所示。
Cursor cursor = LitePal.findBySQL("select * from Book where price", "400", "20");
最后将Cursor中的数据一一取出。