@Entity 自增长id的坑
@Entity
data class User(
@PrimaryKey(autoGenerate = true)
var id: Int?,
@ColumnInfo(name = "user_name")
var userName: String? = null,
var age: Int? = 0
)
一直用User(0)来插入数据库,会报错(如果dao里的insert 设置参数为onConflict = OnConflictStrategy.REPLACE)那么也会覆盖,查询都是一个,所以要用User(null)来传递,网上搜的几个讲解demo里都是提前定义好了id,比如for i User(i)这种,但实际使用,怎么会关注之前存了哪些id呢?本以为用 0 就可以实现,毕竟id一般都是从1开始。不知道是不是room版本问题。本文使用的是room2.2.5。但是java版没有问题。可以直接new User().然后user的id是0.插入时会实现自增长。但如果java版id定义为Integer类型传入0的话,就会和kotlin产生一样的问题了。然后kotlin可以将id赋值默认null就好了,不用构造时传入null。var id: Int?,----》var id: Int?=null, 可以直接var user = User(). user.username="slfj",...这时user的id是null,可以直接insert了。
20.08.21:补充,如果属性是 var id :Int =0 (非空类型),使用User(0)插入时不会有问题,查看了表,id从1开始。上面那种如果定义成var id:Int?然后传入User(0)去插入的话,id就是0.再次插入0不会增长,会报错。
ForeignKey 定义在属性之上 onDelete = CASCADE 不起作用,定义在Entity里才起作用
3。@Relation 关联查询,比如查班级及其内得学生信息,类型要定义成List.如果定义成ArrayList会编译错误,改成List就成功了。。。