栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Room 数据库自增长id导致数据插入失败的解决方案

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Room 数据库自增长id导致数据插入失败的解决方案

问题描述

    在Room数据库中,我们定义数据实体类跟数据库表进行一一对应,在定义的表存我们经常会用到自增长的id列,定义了自增长的列,在插入数据时构建数据实体对象时,如果数据实体类中使用了自增长的id列,数据插入时id列的值可以设置为 null (Kotlin,Java中使用默认值),数据库会自动编排id值。但是如果数据实体类中的id列指定了默认值,出现了数据无法插入的问题(笔者经历)。如下代码所示:

// 数据实体定义
@Entity(tableName = "records")
class Record(@ColumnInfo var timeMillisecond: Long, @ColumnInfo var date: String, @ColumnInfo var time: String,
             @ColumnInfo var dateYM: String, @ColumnInfo var chargeAmount: Float, @ColumnInfo var chargeCost: Float,
             @ColumnInfo var mileage: Int, @ColumnInfo var socBefore: Int = 0, @ColumnInfo var socAfter: Int = 0,
             @ColumnInfo var station: String? = null, @ColumnInfo var memo: String? = null,
             @ColumnInfo var extra: String? = null, @ColumnInfo var carId: Long = -1) {
    @PrimaryKey(autoGenerate = true) var id: Long = -1
}

在其自编id时,以上定义的数据实体无法插入数据。

问题定位

    根据前面提到,问题就出在指定了id列的默认值,导致数据库插入数据时无法编排id导致插入数据失败,但是并不是不能指定默认值,笔者遇到这个问题最终发现是id列的默认值不能为负数。

解决方案

    如果用Java语言,直接使用默认值即可,或者指定0位id列的默认值。如果使用 Kotlin 语言开发,可将 id 列定义为可空,或者指定默认值为 0.

// 数据实体定义
@Entity(tableName = "records")
class Record(@ColumnInfo var timeMillisecond: Long, @ColumnInfo var date: String, @ColumnInfo var time: String,
             @ColumnInfo var dateYM: String, @ColumnInfo var chargeAmount: Float, @ColumnInfo var chargeCost: Float,
             @ColumnInfo var mileage: Int, @ColumnInfo var socBefore: Int = 0, @ColumnInfo var socAfter: Int = 0,
             @ColumnInfo var station: String? = null, @ColumnInfo var memo: String? = null,
             @ColumnInfo var extra: String? = null, @ColumnInfo var carId: Long = -1) {
    @PrimaryKey(autoGenerate = true) var id: Long = -1
}

// 数据实体定义2
@Entity(tableName = "records")
class Record(@ColumnInfo var timeMillisecond: Long, @ColumnInfo var date: String, @ColumnInfo var time: String,
             @ColumnInfo var dateYM: String, @ColumnInfo var chargeAmount: Float, @ColumnInfo var chargeCost: Float,
             @ColumnInfo var mileage: Int, @ColumnInfo var socBefore: Int = 0, @ColumnInfo var socAfter: Int = 0,
             @ColumnInfo var station: String? = null, @ColumnInfo var memo: String? = null,
             @ColumnInfo var extra: String? = null, @ColumnInfo var carId: Long = -1) {
    @PrimaryKey(autoGenerate = true) var id: Long? = null
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/931089.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号