掌握 Android 持久化存儲:Kotlin 與 Room 資料庫實戰教學
1.根據需求導入要用的Room library
2.Room 主體為以下三種:Entity、DAO、Database
3.為防止查詢封鎖 UI,Room 不允許在主執行緒上存取資料庫
透過Room的@Entity標籤可以幫你建立db的table
@PrimaryKey幫你建立了每組資料唯一的Primary key
命名table 欄位 可以直接用變數 如 :id
也可以使用 @ColumnInfo(name = “name”) 指定欄位名稱
透過Room的@Dao標籤可以幫你建立操作db資料的方式
如 @Insert :可以讓你插入到table內
@Query :可以讓你自定義SQL執行
一些常用的SQL可參考官方文件
@Delete :刪除資料
@Insert(onConflict = OnConflictStrategy.REPLACE) :當遇到有衝突Primary key時 會Replace而不是忽略或不做事
@Update: 更新資料
使用@Database來創建一個RoomDatabase
entities 是你要建立的資料表
version 是更新版本用
直接用下面code 來獲得RoomDatabase 實例
透過前面寫好的DAO直接操作
1.Room 2.1 支援suspend function,並使用Coroutines
2.Room 2.2 支援Flow
3.其他也有支援RxJava、LiveData、Guava…等,有興趣可看:官方文件
完成上面操作介面後,照一般使用coroutines、flow、LiveData方式即可
若想要針對資料庫內存有預設資料可將存放資料的.db預先埋入儲存路徑,再透過createFromAsset創建
或者想要用File建立,則改成.createFromFile(File(“mypath”))即可
當原生支援的的變數類型不夠用,剛好又想自訂時,
可用@TypeConverters
轉換變數型態,並讓它能在Room中使用。
假設需要在 Room 資料庫中保存 Date,Room 不知道如何保存 Date 物件,可以用:
有兩張表
某些case下想要取得兩表對應的資料來做使用
加入 對應的父、子entity,以此例,分別是UserEntity、HistoryEntity。
再來加入@Relation 其中需要入對應的唯一鍵值,如primaryKey。
以此例來說parentColumn對應的是UserEntity的primaryKey
entityColumn對應的是HistoryEntity的primaryKey
最後再在DAO加入操作方法:
其中加入@Transaction,可以保證數據的一致性,
因有時候數據庫進行多個操作時,
如操作A表再次操作B表,
若中間A表成功取出,B表失敗,
這時返回的結果可能是錯的,
所以使用@Transaction 可以讓取得資料要就全部成功,不然就全部失敗,
不會讓操作段在一半,使得資料取出怪怪的。
- 自動更新:@Database內的version,加入遷移版本:AutoMigration (from = 1, to = 2)會讓資料庫隨version自動版本遷移。
- 手動更新:透過 Migration 定義遷移的SQL指令
在build Room db時加入Migration,例如: