有没有一种方法可以将值列表与SQLite表进行比较?

时间:2019-02-16 03:09:31

标签: android sqlite android-room

对于使用Room库保存数据的Android应用,我需要此解决方案。我需要实现一种解决方案,其中用户传递一个字符串值列表,将其与表中的数据进行比较,然后返回匹配和不匹配的结果。

因此,从某种意义上讲,我希望用户返回的所有字符串值都返回,无论它们是否与表值匹配。但是,匹配的值将从表中获取更多数据,而不匹配的值将只是值。

例如,我有一个tasks表,该表的列分别为task_idtask_titletask_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'。

任何帮助将不胜感激,谢谢!

1 个答案:

答案 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策略。

最重要的是,输入列表必须“标记化”为各个元素,以便可以确定每个元素的状态。