2018 六月份, 就有研究room這 google 推薦的data base
不過近期在寫的時候, 就忘記該怎麼寫了, 一直遇到
" AppDatabase_Impl does not exist " 錯誤問題,
一直犯蠢找不到問題, 最後雖然解決了, 但還是寫這篇來記錄一下
What's Room
全名是Room Persistence, (更詳細可以去google developer那邊看看)
我這邊就說說我使用後的感覺好了,請各大大不要噴我
google 推出更方便更強大基於SQLite的套件,利用interface 讓開發者定義相關功能
透過系統生成AppDatabase_Impl實作Sqlite的事情
好處是使用 interface 拆開 table 與 data object options 的部分,
讓開發上更不需依賴database的設計, 使用interfase query, insert, update 和 delete 操作
測試上Mock也頗方便。
這種方式就是DAO, data access object (Interfase).
外層不需要知道怎麼操作該table, 只需要他可以幫我做這些data的相關處理就好了 (遵守ISP原則)
好像越說越奇怪了, 直接扯回怎麼開發好了
開發前準備
在build.gradle 加入
dependencies { ... def room_version = "1.1.1" implementation "android.arch.persistence.room:runtime:$room_version" kapt "android.arch.persistence.room:compiler:$room_version" ...
注意 使用 kapt 前記得要在最上方加入apply plugin: 'kotlin-kapt'“ , 不然database 無法產生實體唷,
(error msg: AppDatabase_Impl does not exist )
使用 Room 所必須知道的相關元件
- Entity - data object
- DAO - data option
- Room database
Entity
他是個data object, 在其中可以放入 定義 table name 與 column 相關資訊, 也當可放入其他method 方式
其寫法如下 (這是使用kotlin語言撰寫的)
const val TABLE_EVENT = "event" @Entity (tableName = TABLE_EVENT) class Event { @PrimaryKey(autoGenerate = true) var uid: Int = 0 @ColumnInfo(name = "user_uid") var userUid : String = "" @ColumnInfo(name = "preview_uri") var perviewUri : String = "" }
DAO
這裡負責data 操作, 簡單實作 query, insert, update 與 delete
簡單的範例如下
@Dao interface EventDao { @Query("select * from $TABLE_EVENT") public fun getAll(): List @Insert(onConflict = OnConflictStrategy.REPLACE) public fun insert(event: Event) @Delete public fun delete(event: Event) }
Database
google 範例中使用 singleton的方式
@Database(entities = [Event::class], version = 1) abstract class AppDatabase : RoomDatabase () { public abstract val eventDao: EventDao companion object { private var INSTANCE: AppDatabase? = null fun getInstance(context: Context) = INSTANCE ?: Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME) // .allowMainThreadQueries() don't use, need to in work thread .build().also { INSTANCE = it } } }
延伸閱讀
留言列表