[英]How do I create a new record in Android Room database?
這似乎是一個懶惰的問題,但官方文檔確實沒有解釋如何做到這一點。
https://developer.android.com/training/data-storage/room
我有一個這樣的實體:
@Entity
data class Shader(
@PrimaryKey(autoGenerate = true) val uid: Int,
val name: String,
val shaderMainText: String,
val paramsJson: String?
)
還有我的Dao
上的一些方法:
@Insert
fun insertAll(vararg shaders: Shader)
@Delete
fun delete(shader: Shader)
@Update
fun update(shader: Shader)
如何制作新記錄並插入?
我已經做到了這一點:
val record = Shader(name="Foo", shaderMainText="bar", paramsJson=null)
但它抱怨說我遺漏了參數uid
。 為什么我需要提供一個uid
? 應該是自動生成的吧?
創建新記錄的示例將不勝感激。
您可以將uid
字段的默認值設置為0
@Entity
data class Shader(
@PrimaryKey(autoGenerate = true) val uid: Int = 0,
val name: String,
val shaderMainText: String,
val paramsJson: String?
)
當autoGenerate
為true
時,Room 會忽略默認值,因此它會創建自動遞增的值。 最后,這不會給你一個編譯錯誤:
val record = Shader(name="Foo", shaderMainText="bar", paramsJson=null)
文檔說:
如果字段類型為 long 或 int(或其 TypeConverter 將其轉換為 long 或 int),則插入方法在插入項目時將 0 視為未設置。
如果字段的類型是 Integer 或 Long(或其 TypeConverter 將其轉換為 Integer 或 Long),則插入方法在插入項目時將 null 視為未設置。
所以我會嘗試將要初始化的 uid 設置為 0 或使其可為空並設置為 null。
希望有幫助!
https://developer.android.com/reference/android/arch/persistence/room/PrimaryKey#autoGenerate()
你也可以這樣試試
最佳做法是始終創建一個instance
Class
1st 創建一個數據庫實例 class
@Database(entities = [Shader::class], version = 1) abstract class DatabaseHelper: RoomDatabase() { companion object { private var instance: DatabaseHelper? = null fun getInstance(context: Context?): DatabaseHelper? { if (instance == null) { synchronized(DatabaseHelper::class) { if (context.= null) { instance = Room.databaseBuilder(context,applicationContext: DatabaseHelper:.class,java. "database.db").allowMainThreadQueries():build() } } } return instance } } abstract fun getDao()? DBDao? }
像下面這樣創建你的Shader
data class
@Entity(tableName = "shader") data class Shader( @PrimaryKey(autoGenerate = true) var id: Int?, val name: String, val shaderMainText: String, val paramsJson: String? ) { constructor(name: String, shaderMainText: String, paramsJson: String?): this( null, name, shaderMainText, paramsJson ) }
在這里你要創建constructor
在Shader
中添加數據, insertAll
如下
val record = Shader(name="Foo", shaderMainText="bar", paramsJson=null) DatabaseHelper.getInstance(this)?.getDao()?.insertAll(record)
並且您的數據添加成功
在數據庫中插入數據時,應該始終有一個 @PrimaryKey(autoGenerate = false)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.