话不多说,看例子:
@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)