简介
LitePal是郭霖大神写的。是一个使用起来非常方便的数据库框架。
项目源码地址:
以下内容参照郭霖大神给的文档的翻译。
一、初始化
1.1导入依赖
如果你使用Java:
dependencies {
implementation 'org.litepal.android:java:3.0.0'
}
如果你使用Kotlin:
dependencies {
implementation 'org.litepal.android:kotlin:3.0.0'
}
1.2创建一个名字为 litepal.xml 的文件
在app/src/main下新建assets/litepal.xml(与java目录平级)
如图:
然后填写litepal的内容,内容如下
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<!--
定义应用程序的数据库名称。默认情况下,每个数据库名称应以.db结束。如果你没有名字数据库以.db结束, LitePal将为您自动加上后缀。例如:
<dbname value="demo" />
-->
<dbname value="demo" />
<!--
定义数据库的版本。每一次当你想要数据库升级时,版本标记会有帮助。
修改模型中定义的映射标签“version”,就使版本值+ 1,数据库的升级将自动处理而不会出现问题。例如:
<version value="1" />
-->
<version value="1" />
<!--
在映射标签列表中定义您的模型,LitePal将会为每个映射类创建表。支持类中字段被映射到列。例如:
<list>
<mapping class="com.test.model.Reader" />
<mapping class="com.test.model.Magazine" />
</list>
-->
<list>
</list>
<!--
定义.db文件的位置。
“internal”表示.db文件将存储在内部存储的数据库文件夹中,无人可以访问。
“external”表示.db文件将存储在主外部存储设备上目录的路径中,每个人都可以访问的永久文件。
默认值为“内部 internal”。 例如:
<storage value =“external”/>
-->
</litepal>
所以配置文件拥有以下属性:
- dbname:配置项目的数据库名称。
- version:数据库的版本。如果你想要升级数据库,那就+1。
- list:配置映射类,类和数据库中的表映射。
- storage:配置数据库文件的存储方式,分为内部还是外部存储。内部和外部只能选择一个。
1.3对LitePal初始化
初始化的方式有两种。
第一种是直接在manifest.xml文件中设置application的name属性:
<manifest>
<application
android:name="org.litepal.LitePalApplication"
...
>
...
</application>
</manifest>
第二种是在自己的Application中初始化
<manifest>
<application
android:name="com.example.MyApplication"
...
>
...
</application>
</manifest>
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
LitePal.initialize(this);
}
...
}
二、使用方法
2.1 创建表 Create tables
public class Album extends LitePalSupport {
@Column(unique = true, defaultValue = "unknown")
private String name;
private float price;
private byte[] cover;
private List<Song> songs = new ArrayList<Song>();
// generated getters and setters.
...
}
public class Song extends LitePalSupport {
@Column(nullable = false)
private String name;
private int duration;
@Column(ignore = true)
private String uselessField;
private Album album;
// generated getters and setters.
...
}
然后需要在litepal.xml文件中设置映射
<list>
<mapping class="org.litepal.litepalsample.model.Album" />
<mapping class="org.litepal.litepalsample.model.Song" />
</list>
2.2增加
Java:
Album album = new Album();
album.setName("album");
album.setPrice(10.99f);
album.setCover(getCoverImageBytes());
album.save();
Song song1 = new Song();
song1.setName("song1");
song1.setDuration(320);
song1.setAlbum(album);
song1.save();
Song song2 = new Song();
song2.setName("song2");
song2.setDuration(356);
song2.setAlbum(album);
song2.save();
Kotlin:
val album = Album()
album.name = "album"
album.price = 10.99f
album.cover = getCoverImageBytes()
album.save()
val song1 = Song()
song1.name = "song1"
song1.duration = 320
song1.album = album
song1.save()
val song2 = Song()
song2.name = "song2"
song2.duration = 356
song2.album = album
song2.save()
2.3删除
若果要删除某一条数据,使用delete()方法:
Java:
LitePal.delete(Song.class, id);
Kotlin:
LitePal.delete<Song>(id)
如果要删除多条记录,使用deleteAll()方法:
Java:
LitePal.deleteAll(Song.class, "duration > ?" , "350");
Kotlin:
LitePal.deleteAll<Song>("duration > ?" , "350")
2.4查询
通过id查询某一条数据
Song song = LitePal.find(Song.class, id);
Kotlin:
val song = LitePal.find<Song>(id)
查询所有数据
Java:
Kotlin:
val allSongs = LitePal.findAll<Song>()
构建复杂查询:
Java:
List<Song> songs = LitePal.where("name like ? and duration < ?", "song%", "200").order("duration").find(Song.class);
Kotlin:
val songs = LitePal.where("name like ? and duration < ?", "song%", "200").order("duration").find<Song>()
2.5更改
最简单的方式就是用save()方法去更新find()方法找到的数据:
Java:
Album albumToUpdate = LitePal.find(Album.class, 1);
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.save();
Kotlin:
val albumToUpdate = LitePal.find<Album>(1)
albumToUpdate.price = 20.99f // raise the price
albumToUpdate.save()
你也可以通过update()更新某一条数据
Java:
Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.update(id);
Kotlin:
val albumToUpdate = Album()
albumToUpdate.price = 20.99f // raise the price
albumToUpdate.update(id)
使用updateAll()方法更新多条数据
Java:
Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.updateAll("name = ?", "album");
Kotlin:
val albumToUpdate = Album()
albumToUpdate.price = 20.99f // raise the price
albumToUpdate.updateAll("name = ?", "album")
2.6异步操作
数据库操作默认在主线程执行。同时LitePal对所有crud方法支持异步操作。假如想你想对歌曲表进行异步操作,可以这样做:
Java:
LitePal.findAllAsync(Song.class).listen(new FindMultiCallback<Song>() {
@Override
public void onFinish(List<Song> allSongs) {
}
});
Kotlin:
LitePal.findAsync<Song>().listen { allSongs ->
}
异步只能使用 findAllAsync() 而不是 findAll()。然后追加 listen() 方法,当操作执行完毕,会被回调至 onFinish() 方法。
异步存储也是一样的操作方法。
Java:
Album album = new Album();
album.setName("album");
album.setPrice(10.99f);
album.setCover(getCoverImageBytes());
album.saveAsync().listen(new SaveCallback() {
@Override
public void onFinish(boolean success) {
}
});
Kotlin:
val album = Album()
album.name = "album"
album.price = 10.99f
album.cover = getCoverImageBytes()
album.saveAsync().listen { success ->
}
异步只能使用 saveAsync() 而不是 save()。当操作执行完毕,存储结果会被回调至 onFinish() 方法。
三、多数据库支持
3.1多数据库使用
LitePal支持多数据库,如果你想使用多个数据库,可以这样做:
LitePalDB litePalDB = new LitePalDB("demo2", 1);
litePalDB.addClassName(Singer.class.getName());
litePalDB.addClassName(Album.class.getName());
litePalDB.addClassName(Song.class.getName());
LitePal.use(litePalDB);
将会创建“demo2”数据库,并且创建singer, album 和song表。
如果你只是想创建一个和litepal.xml配置相同的数据库,你可以这样:
LitePalDB litePalDB = LitePalDB.fromDefault("newdb");
LitePal.use(litePalDB);
如果想切换到默认数据库,可以这样操作:
LitePal.useDefault();
可以通过数据库名称删除数据库:
LitePal.deleteDatabase("newdb");
3.2监听数据库的创建和更新
如果你需要监听数据库创建或升级事件,你可以这样做:
LitePal.registerDatabaseListener(new DatabaseListener() {
@Override
public void onCreate() {
// fill some initial data
}
@Override
public void onUpgrade(int oldVersion, int newVersion) {
// upgrade data in db
}
});
四、混淆
-keep class org.litepal.** {
*;
}
-keep class * extends org.litepal.crud.DataSupport {
*;
}
-keep class * extends org.litepal.crud.LitePalSupport {
*;
}