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