如何使主键为房间持久化库自增量

我正在创建一个Entity (房间持久化库)类Food,其中我想使foodId作为自增量。

@Entity
class Food(var foodName: String, var foodDesc: String, var protein: Double, var carbs: Double, var fat: Double)
{
@PrimaryKey
var foodId: Int = 0
var calories: Double = 0.toDouble()
}

如何设置foodId为自增字段?

186930 次浏览

你需要使用autoGenerate属性

你的主键注释应该像这样:

@PrimaryKey(autoGenerate = true)

PrimaryKey的引用。

例如,如果你想存储一个users实体,字段为(firstname, lastname , email),你想自动生成id,你可以这样做。

@Entity(tableName = "users")
data class Users(
@PrimaryKey(autoGenerate = true)
val id: Long,
val firstname: String,
val lastname: String,
val email: String
)

然后,Room将自动生成并自动增加id字段。

你可以像这样添加@PrimaryKey(autoGenerate = true):

@Entity
data class Food(
var foodName: String,
var foodDesc: String,
var protein: Double,
var carbs: Double,
var fat: Double
){
@PrimaryKey(autoGenerate = true)
var foodId: Int = 0 // or foodId: Int? = null
var calories: Double = 0.toDouble()
}

添加@PrimaryKey(autoGenerate = true)

@Entity
public class User {


@PrimaryKey(autoGenerate = true)
private int id;


@ColumnInfo(name = "full_name")
private String name;


@ColumnInfo(name = "phone")
private String phone;


public User(){
}


//type-1
public User(String name, String phone) {
this.name = name;
this.phone = phone;
}


//type-2
public User(int id, String name, String phone) {
this.id = id;
this.name = name;
this.phone = phone;
}


}

存储数据时

 //type-1
db.userDao().InsertAll(new User(sName,sPhone));


//type-2
db.userDao().InsertAll(new User(0,sName,sPhone));

1型

如果你没有为主键传递value,默认情况下它将为0或 null。< / p >

2型

在创建对象时放入id为Null或0(我的case用户对象)

如果字段类型为long或int(或其TypeConverter将其转换为long或int), Insert方法在插入项时将0视为未设置。

如果字段的类型是Integer或Long (Object)(或者它的TypeConverter将其转换为Integer或Long), Insert方法在插入项时将null视为未设置。

@Entity(tableName = "user")
data class User(


@PrimaryKey(autoGenerate = true)  var id: Int?,
var name: String,
var dob: String,
var address: String,
var gender: String
)
{
constructor():this(null,
"","","","")
}

用下面的代码注释你的Entity类。

在Java中:

@PrimaryKey(autoGenerate = true)
private int id;

在芬兰湾的科特林:

@PrimaryKey(autoGenerate = true)
var id: Int

然后,Room将自动生成并自动增加id字段。

这对我来说很管用:

@Entity(tableName = "note_table")
data class Note(
@ColumnInfo(name="title") var title: String,
@ColumnInfo(name="description") var description: String = "",
@ColumnInfo(name="priority") var priority: Int,
@PrimaryKey(autoGenerate = true) var id: Int = 0//last so that we don't have to pass an ID value or named arguments
)

请注意,id放在最后,以避免在将实体插入Room之前创建实体时必须使用命名参数。一旦它被添加到room,在更新实体时使用id。

在这么多答案之后,这是令人难以置信的,但我最后做的有点不同。我不喜欢主键为空,我想把它作为第一个参数插入时不定义它,它也不应该是var。

@Entity(tableName = "employments")
data class Employment(
@PrimaryKey(autoGenerate = true) val id: Long,
@ColumnInfo(name = "code") val code: String,
@ColumnInfo(name = "title") val name: String
){
constructor(code: String, name: String) : this(0, code, name)
}

在下面的例子中,当您创建一个新用户时,将参数传递给构造函数。Room将自动生成id。所有用户对象id在id setter中已经设置为int默认值,所以不要调用setId

@Entity
public class User {


@PrimaryKey(autoGenerate = true)
private int id;


@ColumnInfo(name = "full_name")
private String name;


@ColumnInfo(name = "phone")
private String phone;


   

public User(String name, String phone) {
this.name = name;
this.phone = phone;
}


public void setId(int id){
this.id = id;
}


}