对于使用Room库保存数据的Android应用,我需要此解决方案。我需要实现一种解决方案,其中用户传递一个字符串值列表,将其与表中的数据进行比较,然后返回匹配和不匹配的结果。
因此,从某种意义上讲,我希望用户返回的所有字符串值都返回,无论它们是否与表值匹配。但是,匹配的值将从表中获取更多数据,而不匹配的值将只是值。
例如,我有一个tasks
表,该表的列分别为task_id
,task_title
,task_status
。该表包含以下数据:
1,“任务1”,“处理中”
2,“任务2”,“保留”
3,“任务3”,“已完成”
4,“任务4”,“处理中”
现在,用户传递一个值列表,以查看是否有针对这些值的可用数据。如果存在匹配项,则希望向他们显示该任务的状态。
该列表以String[]
的形式传递,并且可以包含任何值和任意数量的值。让我们假设字符串数组如下:
{'Task 2', 'Task 3', 'Task 5'}
需要什么样的查询才能返回以下结果:
“任务2”,“保留”
“任务3”,“已完成”
“任务5”,不可用(或任何其他消息或无消息)
因此,我需要所有值都通过字符串数组传递,返回的字符串中包含已匹配的数据,而没有数据(或消息)则返回不匹配的数据。
我已经尝试过的查询形式如下:
@Query("SELECT task_title, task_status FROM tasks WHERE task_title IN (:values)")
LiveData<List<Task>> getTasks(String[] values);
它将按照上面的示例返回以下内容:
“任务2”,“保留”
“任务3”,“已完成”
它不会返回实际上需要返回的不匹配值'任务5'。
任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
不是直SELECT
。在sqlite中没有简单的方法(阅读:简单)来完成此任务。 :values
是sqlite的“未知”对象。您是否考虑过根据sql结果和输入值之间的差异将不匹配的结果添加到返回的对象中?
如果安装了JSON1 extension,则可以尝试以下操作:
SELECT value,
CASE when t.task_status is null then "NOT FOUND" else t.task_status END status
FROM json_each(json_array(:values))
LEFT join tasks t on t.task_title = value
另一个选项可能是一个表,该表将一行中的每个输入值保存在一起,因此可以应用相同的JOIN策略。
最重要的是,输入列表必须“标记化”为各个元素,以便可以确定每个元素的状态。