使用 like 关键字在单个查询中匹配多个标题
我正在尝试获取与给定标题匹配的所有记录。
下面是数据库的结构请参阅
数据库截图 https://prnt.sc/JduJ6NSIr1E-
当我传递单个类似查询时,它返回数据
@Query("SELECT * FROM task WHERE task_tags LIKE '%\"title\":\"Priority\"%'")
当我尝试动态生成查询来搜索多个匹配项时,它返回 0 数据
val stringBuilder = StringBuilder()
for (i in 0 until tags.size) {
val firstQuery = "%\"title\":\"Priority\"%"
if (i == 0) {
stringBuilder.append(firstQuery)
} else stringBuilder.append(" OR '%\"title\":\"${tags[i].title}\"%'")
}
这是我做的功能
@Query("SELECT * FROM task WHERE task_tags LIKE:tagQuery ")
fun getTaskByTag(stringBuilder.toString() : String): List<Task>
单个数据就好了。但是,您根本无法使用第二种方法。
首先你省略了 LIKE 之后的空格,
那么你就省略了完整的测试,即你有task_ tags LIKE ? OR ??
当它应该是task_tags LIKE ? OR task_tags LIKE ?? ....
即便如此,由于 room 处理参数的方式,整个参数被包装/封装为单个字符串,因此 OR/OR LIKE 都成为作为单个测试搜索的内容的一部分。
- 至少从数据库的角度来看,正确的解决方案是不要有一个带有标签列表的 JSON 表示形式的列,而是有一个标签表,然后,因为你想要一个多对多关系 (一个任务可以有多个标签,并且多个任务可以使用一个标签)一个关联表,然后您可以使用 IN 子句进行测试。
不过,作为一种解决方法,您可以使用 RawQuery,其中相应地构建 SQL 语句。
举个例子:-
@RawQuery
fun rawQuery(qry: SimpleSQLiteQuery): Cursor
@SuppressLint("Range")
fun getTaskByManyTags(tags: List<String>): List<Task> {
val rv = ArrayList<Task>()
val sb=StringBuilder()
var afterFirst = false
for (tag in tags) {
if (afterFirst) {
sb.append(" OR task_tags ")
}
sb.append(" LIKE '%").append(tag).append("%'")
afterFirst = true
}
if (sb.isNotEmpty()) {
val csr: Cursor = rawQuery(SimpleSQLiteQuery("SELECT * FROM task WHERE task_tags $sb"))
while (csr.moveToNext()) {
rv.add(
Task(
csr.getLong(csr.getColumnIndex("tid")),
csr.getString(csr.getColumnIndex("task_title")),
csr.getString(csr.getColumnIndex("task_tags"))))
// other columns ....
}
csr.close()
}
return rv
}
已经进行了非常有限的测试(因此只有 3 列),但是针对非常有限的数据库(基本上是同一行)运行所有 3 列(根据上述 3 次调用)的结果达到了预期的结果(根据断点):-
- 第一个返回空列表,因为没有搜索参数。
- the second and third both return all 4 rows as "title":"Priority" is in all 4 rows
- 使用 3 个搜索参数的主要原因是检查多个参数的语法,而不是检查是否做出了正确的选择。
最后(3 个传递的标签)的结果查询是(从 getTaskaByManyTags 函数中提取):-
SELECT * FROM task WHERE task_tags LIKE '%"title":"Priority"%' OR task_tags LIKE '%"title":"Priority"%' OR task_tags LIKE '%"title":"Priority"%'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)