使用 Jetpack Room 的时候出现的问题及解决方法

文章讲述了在SQLite数据库操作中,如何正确使用@Query进行LIKE查询,以及在实体类中设置主键为autogenerate时,解决插入和更新数据时遇到的问题。通过在查询语句中动态添加%来匹配LIKE条件,以及将主键设为可空避免冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话不多说,看例子:

@Query("SELECT * FROM precious WHERE name LIKE :searchContent OR remark LIKE :searchContent")
  fun find(searchContent: String): MutableList<Precious>

interface DAO 中的一个方法,查询表中 name 和 remark 包含搜索内容的数据,照这样写是查不到数据的,SQL 的写法是这样的:

SELECT * FROM precious WHERE name LIKE %searchContent% OR remark LIKE %searchContent%

于是想当然的给@Query中的语句加上%,变成这样 %:searchContent%,结果报错了。
最后找了一圈,在 stackoverflow 上看到了一个解决方法,总感觉不够官方,但确实有用。
解:调用 find(searchContent: String)函数时,传入的参数加上%:

dataList = preciousDao.find("%$it%")

另一个问题:

实体类主键id设为 autogenerate ,使用insert函数插入数据时构建的实体类必须传入id,但这样和自动生成主键就冲突了,也影响后续update函数的使用,解决方法:
id 设为可空,默认值为null,构建实体类时传入null,这样就ok了。

@Entity
data class Precious (
    @PrimaryKey(autoGenerate = true)
    val id: Long? = null,
    @ColumnInfo(name="name") val name: String,
    @ColumnInfo(name="type") val type: PreciousType,
    @ColumnInfo(name="remark") val remark: String?
)
 val precious = Precious(null,
                    binding.etName.editableText.trim().toString(),
                    type,
                    binding.etRemark.editableText.trim().toString()
                )
                dao.insert(precious)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值