kotlin.罗 之必杀 room 坑之两三事

@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就成功了。。。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值