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

话不多说,看例子:

@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)

猜你喜欢

转载自blog.csdn.net/u012175780/article/details/130247288