LitePal是一個開放源碼的Android庫,非常容易地使用SQLite數(shù)據(jù)庫。無需編寫SQL語句的情況下,可以完成大多數(shù)數(shù)據(jù)庫操作,包括創(chuàng)建或升級表、CRUD操作、聚合函數(shù)等。
- 項目是郭霖(第一行代碼作者)團隊開源維護,有非常完善的中文文檔
- 持續(xù)更新中,針對kotlin語法進行過優(yōu)化,使用起來非常絲滑
- 幾乎為零配置(只有一個配置文件,幾乎沒有屬性)
- 自動維護所有表(例如創(chuàng)建、更改或刪除表)
- 簡易完善而流暢的API
準備
導(dǎo)入
implementation 'org.litepal.android:kotlin:3.0.0'
配置
唯一的配置文件,在assets下新建一個litepal.xml然后按一下規(guī)則配置
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<!--
定義應(yīng)用程序的數(shù)據(jù)庫名稱。
默認情況下,每個數(shù)據(jù)庫名都應(yīng)該以.db結(jié)尾。
如果你沒有用。db來命名你的數(shù)據(jù)庫,LitePal會自動為你加上后綴。
For example:
下面寫法會生成BookStore.db
-->
<dbname value="BookStore" />
<!--
定義數(shù)據(jù)庫的版本。
每次你想要升級數(shù)據(jù)庫,修改映射標記中定義的版本值+ 1,數(shù)據(jù)庫升級將會被自動處理。
詳情見后文的升級.
-->
<version value="1" />
<!--
用映射標簽指定的modle在表中定義數(shù)據(jù)模型.
LitePal會在模型中定義的字段將映射到對應(yīng)表的列中。
For example:
下面Song 屬于package com.routon.litepal.litepaltest.dbmodel
-->
<list>
<mapping class="com.routon.litepal.litepaltest.dbmodel.Album" />
<mapping class="com.routon.litepal.litepaltest.dbmodel.Song" />
<mapping class="com.routon.litepal.litepaltest.dbmodel.Book" />
</list>
<!--
定義.db文件的位置。
"internal"表示.db文件將存儲在內(nèi)部存儲的數(shù)據(jù)庫文件夾中,沒有人可以訪問,默認設(shè)置。。
"external"表示.db文件將存儲在主外部存儲設(shè)備上的目錄路徑中,應(yīng)用程序可以在該路徑中放置它所擁有的每個人都可以訪問的持久文件。
也可以自定義:
For example:
下面路徑即為 /storage/emulated/0/routon/litePal/db/BookStore.db
-->
<storage value="routon/litePal/db" />
</litepal>
配置完成
配置LitePalApplication
在我們的Application中
override fun onCreate() {
...
LitePal.initialize(this)
...
}
即可
LitePal.initialize(this)此方法需要盡早調(diào)用,且使用application context作為參數(shù)
開始使用
1.定義model
java:
public class Song extends LitePalSupport {
@Column(nullable = false)
private String name;
private int duration;
@Column(defaultValue="無用")
private String uselessField;
// generated getters and setters.
...
}
kotlin:
class Book(
@Column(unique = true, defaultValue = "unknown")
val name: String,
val page: Int) : LitePalSupport() {
val id: Long = 0
}
需要注意的是,如果你的實體類中需要定義id這個字段,不要把它放到構(gòu)造函數(shù)當中,因為id的值是由LitePal自動賦值的,而不應(yīng)該由用戶來指定。因此這里我們在Book類的內(nèi)部聲明了一個只讀類型的id。
然后將這些模型添加到litepal.xml
<list>
<mapping class="com.routon.litepal.litepaltest.dbmodel.Song" />
<mapping class="com.routon.litepal.litepaltest.dbmodel.Book" />
</list>
下一次操作數(shù)據(jù)庫時將生成這些表。例如,獲取SQLiteDatabase有以下代碼:
LitePal.getDatabase()
在實踐中發(fā)現(xiàn),LitePal需要文件讀取權(quán)限,也就是說,這一步操作需要放到獲取權(quán)限之后
2.升級表
只要修改想改模型就行了
然后在配置文件litepal.xml中把<version value="x" />改為<version value="x+1" />就可以了
注意
有些升級條件LitePal無法處理,升級表中的所有數(shù)據(jù)都將被清除:
- 添加一個注釋為unique = true.
- 將字段的注釋更改為unique = true.
- 將字段的注釋更改為nullable = false.
注意以上情況,這樣會導(dǎo)致數(shù)據(jù)丟失。
3.增刪改查
增
繼承自LitePalSupport的每個模型都有save()方法。
直接調(diào)用即可
val song = Song()
song.name = "first song"
song.duration = 180
song.save()
如此簡單
查
val songs = LitePal
.where("name like ?", "first%").limit(1)
.find<Song>()
改
songs[0].name="second song"
songs[0].save()
刪
songs[0].name="second song"
songs[0].delete()
其他的例子
實在是語義性太強了,不需要注釋,自行閱讀吧
val albumToUpdate = LitePal.find<Album>(1)
albumToUpdate.price = 20.99f // raise the price
albumToUpdate.save()
val albumToUpdate = Album()
albumToUpdate.price = 20.99f // raise the price
albumToUpdate.update(id)
val albumToUpdate = Album()
albumToUpdate.price = 20.99f // raise the price
albumToUpdate.updateAll("name = ?", "album")
LitePal.delete<Song>(id)
LitePal.deleteAll<Song>("duration > ?" , "350")
val song = LitePal.find<Song>(id)
val allSongs = LitePal.findAll<Song>()
val songs = LitePal.where("name like ? and duration < ?", "song%", "200").order("duration").find<Song>()
4.異步操作
默認情況下,每個數(shù)據(jù)庫操作都位于主線程上。如果操作可能花費很長時間,例如保存或查詢大量記錄。就可能需要使用異步操作。
LitePal支持對所有CRUD方法的異步操作。
例如:要在后臺線程上查找song表中的所有記錄,請使用如下代碼。
LitePal.findAsync<Song>().listen { allSongs ->
}
5.其他
可以支持多數(shù)據(jù)庫,也有升級監(jiān)聽.暫時不需要,可以自行了解
結(jié)語
相關(guān)demo git庫
https://git.dev.tencent.com/zhoulei26/android-scarlet.git