Android LitePal库详解
目錄
- 一、GitHub
- 二、LitePal簡(jiǎn)介
- 三、LitePal特征
- 四、配置
- 1.添加 LitePal 庫(kù)
- 2.創(chuàng)建 litepal.xml 文件
- 3. 配置 LitePalApplication
- 五、開始使用
- 1.創(chuàng)建表
- 2. 升級(jí)表
- 3. 保存數(shù)據(jù)
- 4. 更新數(shù)據(jù)
- 5. 刪除數(shù)據(jù)
- 6. 查詢數(shù)據(jù)
- 7. 多個(gè)數(shù)據(jù)庫(kù)
- 8. Transaction
- 六、混淆
一、GitHub
1、GitHub:鏈接
二、LitePal簡(jiǎn)介
LitePal 是一個(gè)開源 Android 庫(kù),它允許開發(fā)人員極其輕松地使用 SQLite 數(shù)據(jù)庫(kù)。無需編寫SQL語句即可完成大部分?jǐn)?shù)據(jù)庫(kù)操作,包括創(chuàng)建或升級(jí)表、crud操作、聚合函數(shù)等。 LitePal的設(shè)置也非常簡(jiǎn)單,不到5分鐘就可以將其集成到你的項(xiàng)目中分鐘。
三、LitePal特征
- 使用對(duì)象關(guān)系映射 (ORM) 模式。
- 幾乎零配置(只有一個(gè)配置文件,屬性很少)。
- 自動(dòng)維護(hù)所有表(例如創(chuàng)建、更改或刪除表)。
- 支持多數(shù)據(jù)庫(kù)。
- 用于避免編寫 SQL 語句的封裝 API。
- 很棒的流暢查詢 API。
- 仍然使用 SQL 的替代選擇,但比原始 API更簡(jiǎn)單、更好。
四、配置
1.添加 LitePal 庫(kù)
在build.gradle文件添加以下依賴項(xiàng)。
dependencies {implementation 'org.litepal.guolindev:core:3.2.3' }2.創(chuàng)建 litepal.xml 文件
在main文件夾中創(chuàng)建assets文件夾,并在assets文件夾中創(chuàng)建一個(gè)文件,并將其命名為litepal.xml。然后把下面的代碼復(fù)制進(jìn)去。
這是唯一的配置文件,屬性簡(jiǎn)單。
- dbname:配置項(xiàng)目的數(shù)據(jù)庫(kù)名稱。
- version:配置數(shù)據(jù)庫(kù)的版本。每次要升級(jí)數(shù)據(jù)庫(kù),加這里的值。
- list:配置映射類。
- storage:配置應(yīng)該存儲(chǔ)數(shù)據(jù)庫(kù)文件的位置。internal和external是唯一有效的選項(xiàng)。
3. 配置 LitePalApplication
你不想一直傳遞 Context 參數(shù)。為了使 API 變得簡(jiǎn)單,只需在AndroidManifest.xml 中配置 LitePalApplication如下:
<manifest><applicationandroid:name="org.litepal.LitePalApplication"...>...</application> </manifest>當(dāng)然你可能有自己的應(yīng)用程序并且已經(jīng)在這里配置好了,比如:
<manifest><applicationandroid:name="com.example.MyApplication"...>...</application> </manifest>沒關(guān)系。LitePal 仍然可以接受。只需在你自己的應(yīng)用程序中調(diào)用LitePal.initialize(context):
public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();LitePal.initialize(this);} }確保盡早調(diào)用此方法。在 Application 的 onCreate() 方法中就可以了。并且永遠(yuǎn)記住使用應(yīng)用程序上下文作為參數(shù)。不要使用任何活動(dòng)或服務(wù)的實(shí)例作為參數(shù),否則可能會(huì)發(fā)生內(nèi)存泄漏。
五、開始使用
1.創(chuàng)建表
首先定義模型。例如,你有兩個(gè)模型,Album 和 Song,都繼承LitePalSupport 。這些模型可以定義如下:
public class Album extends LitePalSupport {@Column(unique = true, defaultValue = "unknown")private String name;@Column(index = true)private float price;private List<Song> songs = new ArrayList<>();// 生成getter和setter方法。... } public class Song extends LitePalSupport {@Column(nullable = false)private String name;private int duration;@Column(ignore = true)private String uselessField;private Album album;// 生成getter和setter方法。... }然后將這些模型添加到 litepal.xml 中的映射列表中:
<list><mapping class="org.litepal.litepalsample.model.Album" /><mapping class="org.litepal.litepalsample.model.Song" /> </list>下次操作數(shù)據(jù)庫(kù)時(shí)會(huì)生成這些表。例如,使用以下代碼獲取 SQLiteDatabase:
SQLiteDatabase db = LitePal.getDatabase();現(xiàn)在這些表將使用 SQL 自動(dòng)生成,如下所示:
CREATE TABLE album (id integer primary key autoincrement,name text unique default 'unknown',price real );CREATE TABLE song (id integer primary key autoincrement,name text not null,duration integer,album_id integer );2. 升級(jí)表
在 LitePal 中升級(jí)表非常容易。只需修改你的模型即可:
public class Album extends LitePalSupport {@Column(unique = true, defaultValue = "unknown")private String name;@Column(ignore = true)private float price;private Date releaseDate;private List<Song> songs = new ArrayList<>();// 生成的getter和setter方法。... }添加了一個(gè) releaseDate 字段,并注釋了 price 字段以忽略。然后在litepal.xml 中增加版本號(hào):
<!--定義數(shù)據(jù)庫(kù)的版本。每次升級(jí)數(shù)據(jù)庫(kù)時(shí),版本標(biāo)簽都會(huì)有所幫助。修改你在mapping標(biāo)簽中定義的模型,只需將版本值加上一,數(shù)據(jù)庫(kù)的升級(jí)將自動(dòng)進(jìn)行,無需擔(dān)心。例如:<version value="1" />--><version value="2" />下次操作數(shù)據(jù)庫(kù)時(shí)會(huì)升級(jí)這些表。album 表中將增加一個(gè) releaseDate 列,并刪除原來的 price 列。album 表中除刪除的列之外的所有數(shù)據(jù)都將保留。
但是有一些升級(jí)情況是 LitePal 無法處理的,升級(jí)表中的所有數(shù)據(jù)都會(huì)被清理:
- 添加一個(gè)注釋為 的字段 unique = true
- 將字段的注釋更改為 unique = true
- 將字段的注釋更改為 nullable =false
請(qǐng)注意上述會(huì)導(dǎo)致數(shù)據(jù)丟失的情況。
3. 保存數(shù)據(jù)
保存 API 是非常面向?qū)ο蟮摹?LitePalSupport 繼承的每個(gè)模型都將免費(fèi)擁有 save() 方法。
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()這會(huì)將album、song1 和 song2 插入到關(guān)聯(lián)的數(shù)據(jù)庫(kù)中。
4. 更新數(shù)據(jù)
最簡(jiǎn)單的方法,使用 save() 方法更新 find() 找到的記錄。
Java:
Album albumToUpdate = LitePal.find(Album.class, 1); albumToUpdate.setPrice(20.99f); // 提高價(jià)格 albumToUpdate.save();Kotlin:
val albumToUpdate = LitePal.find<Album>(1) albumToUpdate.price = 20.99f // 提高價(jià)格 albumToUpdate.save()從 LitePalSupport 繼承的每個(gè)模型也將具有 update() 和 updateAll() 方法。你可以使用指定的 id 更新單個(gè)記錄。
Java:
Album albumToUpdate = new Album(); albumToUpdate.setPrice(20.99f); // 提高價(jià)格 albumToUpdate.update(id);Kotlin:
val albumToUpdate = Album() albumToUpdate.price = 20.99f // 提高價(jià)格 albumToUpdate.update(id)或者你可以使用 where 條件更新多個(gè)記錄。
Java:
Album albumToUpdate = new Album(); albumToUpdate.setPrice(20.99f); // 提高價(jià)格 albumToUpdate.updateAll("name = ?", "album");Kotlin:
val albumToUpdate = Album() albumToUpdate.price = 20.99f // 提高價(jià)格 albumToUpdate.updateAll("name = ?", "album")5. 刪除數(shù)據(jù)
可以使用 LitePal 中的靜態(tài) delete() 方法刪除單個(gè)記錄。
Java:
LitePal.delete(Song.class, id);Kotlin:
LitePal.delete<Song>(id)或者使用 LitePal 中的靜態(tài) deleteAll() 方法刪除多條記錄。
Java:
LitePal.deleteAll(Song.class, "duration > ?" , "350");Kotlin:
LitePal.deleteAll<Song>("duration > ?" , "350")6. 查詢數(shù)據(jù)
從 song 表中查找具有指定 id 的單個(gè)記錄。
Java:
Song song = LitePal.find(Song.class, id);Kotlin:
val song = LitePal.find<Song>(id)從 song 表中查找所有記錄。
Java:
List<Song> allSongs = LitePal.findAll(Song.class);Kotlin:
val allSongs = LitePal.findAll<Song>()用流利的查詢構(gòu)造復(fù)雜的查詢。
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>()7. 多個(gè)數(shù)據(jù)庫(kù)
如果你的應(yīng)用需要多個(gè)數(shù)據(jù)庫(kù),LitePal 完全支持。你可以在運(yùn)行時(shí)創(chuàng)建任意數(shù)量的數(shù)據(jù)庫(kù)。例如:
LitePalDB litePalDB = new LitePalDB("demo2", 1); litePalDB.addClassName(Singer.class.getName()); litePalDB.addClassName(Album.class.getName()); litePalDB.addClassName(Song.class.getName()); LitePal.use(litePalDB);這將創(chuàng)建一個(gè)包含 singer 、album 和 song 表的 demo2 數(shù)據(jù)庫(kù)。
如果你只想創(chuàng)建一個(gè)新數(shù)據(jù)庫(kù)但與 litepal.xml 具有相同的配置,你可以使用:
LitePalDB litePalDB = LitePalDB.fromDefault("newdb"); LitePal.use(litePalDB);還可以隨時(shí)切換回默認(rèn)數(shù)據(jù)庫(kù):
LitePal.useDefault();還可以通過指定的數(shù)據(jù)庫(kù)名稱刪除任何數(shù)據(jù)庫(kù):
LitePal.deleteDatabase("newdb");8. Transaction
LitePal 支持原子數(shù)據(jù)庫(kù)操作的事務(wù)。事務(wù)中的所有操作將一起提交或回滾
Java usage:
LitePal.beginTransaction(); boolean result1 = // db operation1 boolean result2 = // db operation2 boolean result3 = // db operation3 if (result1 && result2 && result3) {LitePal.setTransactionSuccessful(); } LitePal.endTransaction();Kotlin usage:
LitePal.runInTransaction {val result1 = // db operation1val result2 = // db operation2val result3 = // db operation3result1 && result2 && result3 }六、混淆
1、如果你使用 ProGuard,你可能需要添加以下選項(xiàng):
-keep class org.litepal.** {*;} -keep class * extends org.litepal.crud.LitePalSupport {*;}總結(jié)
以上是生活随笔為你收集整理的Android LitePal库详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怀念西电北门的石凳(转载)
- 下一篇: TCP/IP协议族之应用层协议(FTP、