kotlin 如何在Android房间数据库中创建新记录?

lkaoscv7  于 2023-01-17  发布在  Kotlin
关注(0)|答案(4)|浏览(137)

这似乎是一个懒惰的问题,但官方文件字面上没有解释如何做到这一点。
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?它应该是自动生成的?
如能提供创建新记录的示例,将不胜感激。

ibrsph3r

ibrsph3r1#

您可以将0设置为uid字段的默认值

@Entity
data class Shader(
    @PrimaryKey(autoGenerate = true) val uid: Int = 0,
    val name: String,
    val shaderMainText: String,
    val paramsJson: String?
)

autoGeneratetrue时,Room忽略默认值,因此它创建自动递增的值。最后,这不会给予你一个编译错误:

val record = Shader(name="Foo", shaderMainText="bar", paramsJson=null)
qkf9rpyu

qkf9rpyu2#

医生说:
如果字段类型为long或int(或者其TypeConverter将其转换为long或int),则Insert方法在插入项时将0视为未设置。
如果字段的类型是Integer或Long(或者其TypeConverter将其转换为Integer或Long),则Insert方法在插入项时将null视为未设置。
因此,我会尝试将uid初始化为0,或者使其可为空并设置为null。
希望能有所帮助!
https://developer.android.com/reference/android/arch/persistence/room/PrimaryKey#autoGenerate()

bejyjqdl

bejyjqdl3#

你也可以这样尝试

最佳做法是始终创建instance

  • 第一次创建数据库示例类
@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?

}
  • 创建您的Shaderdata 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

  • ShaderinsertAll中添加数据,如下所示
val record = Shader(name="Foo", shaderMainText="bar", paramsJson=null)
 DatabaseHelper.getInstance(this)?.getDao()?.insertAll(record)

您的数据已成功添加

hc8w905p

hc8w905p4#

在数据库中插入数据时,应始终存在@PrimaryKey(autoGenerate = false

相关问题