close

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 }
    }
}

 

延伸閱讀

Android Room (二)

 

 

 

 

 

arrow
arrow

    Owen Chen 發表在 痞客邦 留言(0) 人氣()