掌握 Android 持久化存儲:Kotlin 與 Room 資料庫實戰教學

前言

1.根據需求導入要用的Room library
2.Room 主體為以下三種:Entity、DAO、Database
3.為防止查詢封鎖 UI,Room 不允許在主執行緒上存取資料庫

實作
1.建立Entity


透過Room的@Entity標籤可以幫你建立db的table
@PrimaryKey幫你建立了每組資料唯一的Primary key
命名table 欄位 可以直接用變數 如 :id
也可以使用 @ColumnInfo(name = “name”) 指定欄位名稱

2.建立DAO


透過Room的@Dao標籤可以幫你建立操作db資料的方式
@Insert :可以讓你插入到table內
@Query :可以讓你自定義SQL執行
一些常用的SQL可參考官方文件
@Delete :刪除資料
@Insert(onConflict = OnConflictStrategy.REPLACE) :當遇到有衝突Primary key時 會Replace而不是忽略或不做事
@Update: 更新資料

3.建立Database


使用@Database來創建一個RoomDatabase
entities 是你要建立的資料表
version 是更新版本用

4.Build Database


直接用下面code 來獲得RoomDatabase 實例

5.實際操作Room


透過前面寫好的DAO直接操作

其他用法
非同步DAO用法
支援程度

1.Room 2.1 支援suspend function,並使用Coroutines
2.Room 2.2 支援Flow 3.其他也有支援RxJava、LiveData、Guava…等,有興趣可看:官方文件

Coroutines 操作Room用法
Flow、LiveData操作Room用法

完成上面操作介面後,照一般使用coroutines、flow、LiveData方式即可

想要預先建立資料庫內容.db檔

若想要針對資料庫內存有預設資料可將存放資料的.db預先埋入儲存路徑,再透過createFromAsset創建
或者想要用File建立,則改成.createFromFile(File(“mypath”))即可

類型轉換器

當原生支援的的變數類型不夠用,剛好又想自訂時,
可用@TypeConverters
轉換變數型態,並讓它能在Room中使用。
假設需要在 Room 資料庫中保存 Date,Room 不知道如何保存 Date 物件,可以用:

創建TypeConverter
加入到DB
能在Room中使用了
Room程式碼上的一些使用技巧
1.可支援tableName用標籤形式定義 且 支援多重主鍵primaryKeys
2.建立Embedded物件,並讓data class 建立儲存欄位
3.定義資料表關聯

有兩張表
某些case下想要取得兩表對應的資料來做使用
加入 對應的父、子entity,以此例,分別是UserEntity、HistoryEntity。
再來加入@Relation 其中需要入對應的唯一鍵值,如primaryKey。
以此例來說parentColumn對應的是UserEntity的primaryKey
entityColumn對應的是HistoryEntity的primaryKey
最後再在DAO加入操作方法:
其中加入@Transaction,可以保證數據的一致性,
因有時候數據庫進行多個操作時,
如操作A表再次操作B表,
若中間A表成功取出,B表失敗,
這時返回的結果可能是錯的,
所以使用@Transaction 可以讓取得資料要就全部成功,不然就全部失敗,
不會讓操作段在一半,使得資料取出怪怪的。

4.針對資料庫做版本遷移
  • 自動更新:@Database內的version,加入遷移版本:AutoMigration (from = 1, to = 2)會讓資料庫隨version自動版本遷移。
  • 手動更新:透過 Migration 定義遷移的SQL指令 room 1 在build Room db時加入Migration,例如:

You might also enjoy