iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 17
0

2017年05月, Google 在I/O’17 發布 Room,讓開發者在開發APP上對於資料庫的操作需求又多了一個選擇。

現在來作簡單的實作。

首先在
app gradle增加

apply plugin: 'kotlin-kapt'

//使用生成文件
kapt {
    generateStubs = true
}

然後implementation下列資訊

    implementation "android.arch.persistence.room:runtime:1.1.1"
    annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
    kapt "android.arch.persistence.room:compiler:1.1.1"

    testImplementation "android.arch.persistence.room:testing:1.0.0"

ROOM組成元件

  • Entity - data object
  • DAO - data option
  • Room database

那麼我們分別建立3個class

Entity.kt

@Entity(tableName = "AppDataBase")
data class Entity constructor(@ColumnInfo(name = "id")
                                   @PrimaryKey(autoGenerate = true)
                                   var id: Int = 0,
                                   @ColumnInfo(name = "name")
                                   var name: String? = null
) {
    constructor() : this(0)
}

這邊是定義資料表各項欄位屬性。

DAO.kt

@Dao
interface KotlinDao {
    @Insert
    fun insertKotlin(kotlin: Entity)

    @Insert
    fun insertKotlins(kotlins: List<Entity>)

    @Query("select * from kotlin")
    fun selectKotlin(): List<Entity>
}

這邊就是定義操作方法了,在這邊我們定義了insert跟query的方法。

Database.kt

@Database(entities = arrayOf(Entity::class), version = 1)
abstract class AppDataBase : RoomDatabase() {
    abstract fun kotlinDao(): KotlinDao
    companion object {
        private var INSTANCE: AppDataBase? = null

        fun getInstance(context: Context): AppDataBase {
            if (INSTANCE == null) {
                synchronized(AppDataBase::class) {
                    INSTANCE = Room.databaseBuilder(context,
                        AppDataBase::class.java,
                        AppDataBase::class.java.simpleName
                    ).build()
                }
            }
            return INSTANCE!!
        }
    }
}

這裡就是定義資料庫,這邊會作到資料庫物件維持單一實例,整個操作都是用同一個實體去操作,所以不會有搶奪資料庫資源情況發生。

然後在MainAvtivity下宣告

val appDb = AppDataBase.getInstance(this)
AsyncTask.execute {
    appDb.clearAllTables() //清除表格內容
    var list: List<Entity> = emptyList()
    list += Entity(id = 1, name = "I am one")
    list += Entity(id = 2, name = "I am two")
    list += Entity(id = 3, name = "I am three")
    list += Entity(id = 4, name = "I am four")
    list += Entity(id = 5, name = "I am five")
    appDb.kotlinDao().insertKotlins(list)

    var kotlinlist = appDb.kotlinDao().selectKotlin()
    Log.e("", "kotlinsize = " + kotlinlist.size)
    for (i in 0 until kotlinlist.size) {
        Log.d("SHOW", "kotlinData = " + kotlinlist[i])
    }

}

這裡我們使用了一行 appDb.kotlinDao().insertKotlins(list)來完成insert動作。
我們傳入了一個list物件,其他就交由ROOM完成是不是很方便。

一個簡單的ROOM的實作就完成了


上一篇
來用Anko SQLite 使用ManagedSQLiteOpenHelper實作SQL模板
下一篇
Room小技巧 insert資料時,如果Entity將欄位有primary key屬性,又設定為autoGenerate = true 要怎麼處理
系列文
跟Kotlin一起來聊Android元件 或許還有應用,或許還有一些資訊雜談30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言