iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 18
0
自我挑戰組

跟Kotlin一起來聊Android元件 或許還有應用,或許還有一些資訊雜談系列 第 18

Room小技巧 insert資料時,如果Entity將欄位有primary key屬性,又設定為autoGenerate = true 要怎麼處理

先上
Entity

@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

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

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

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

如上設定,如果要新增資料時,會使用到data class Entity。
但是,我們在Entity裡設定id為autoGenerate = true,
所以要新增時,每次都要取得之前資料的最後一筆才能執行動作,不然會報錯。

這時候可以使用一種方法,首先改寫Entity

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

將帶有宣告為autoGenerate = true的欄位,宣告成可空型態。

這邊的例子是把var id: Int = 0改成var id: Int? = 0

在Activity將id的值改成null。

...
var list: List<Entity> = emptyList()
            list += Entity(id = null, name = "I am one")
            list += Entity(id = null, name = "I am two")
            list += Entity(id = null, name = "I am three")
            list += Entity(id = null, name = "I am four")
            list += Entity(id = null, name = "I am five")
            appDb.kotlinDao().insertKotlins(list)
...

這樣在新增時,由於我們指定null值給id,故每筆新增資料autoGenerate就會自動補上最新遞增數值。


上一篇
今天來個ROOM
下一篇
當Activity宣告為singleTask時,從不同地方要傳資料就要使用onNewIntent覆寫
系列文
跟Kotlin一起來聊Android元件 或許還有應用,或許還有一些資訊雜談30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言