Android Room数据库创建没有Id的实体对象

11

我的实体类:

@Entity(tableName = "student")
data class Student(
    @PrimaryKey(autoGenerate = true)
    val id: Long,

    val name: String,
    val age: Int,
    val gpa: Double,
    val isSingle: Boolean
) 

问题是,由于id是由Room数据库自动生成的,意味着无论我在构造函数中放置什么id值都将被覆盖,而且因为它是构造函数的参数之一,所以我必须每次像这样提供id

val student = Student(0L, "Sam", 27, 3.5, true)

我该如何避免编造id,以便像这样输入必要的数据:

val student = Student("Sam", 27, 3.5, true)
3个回答

11

不要把id写在构造函数里:

@Entity(tableName = "student")
data class Student(
    val name: String,
    val age: Int,
    val gpa: Double,
    val isSingle: Boolean
) {
    @PrimaryKey(autoGenerate = true)
    var id: Long? = null
}

5

如何避免杜撰id

只需将默认值设为0(或null)即可。

@Entity(tableName = "student")
data class Student(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0, <-- default value (or use null)

id是由Room数据库自动生成的,这意味着无论我在构造函数中放什么id值,它都将被覆盖掉。

实际上不完全是这样的。如果您明确设置了id,则此id将在插入时使用。


无法工作,提示“类型不匹配”第一个参数。 - Sam Chen
1
好的,你可以 1. 将 id 参数放置在构造函数的最后一个参数位置。或者 2. 使用命名参数,像这样:val student = Student(name = "Sam", age = 27, gpa = 3.5, isSingle = true) - sergiy tikhonov
如果您像示例中使用Long类型,则默认值也需要是Long类型,因此请将其设置为0L而不是仅仅的0 - Ridcully

0
如果您想要自動增量 ID,只需在實體中將 ID 的類型設置為 Int,並在構造函數中使用 null 值作為 ID 值參數,它就會為您處理工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接