【问题标题】:Is there a way to compare a list of values with a SQLite table?有没有办法将值列表与 SQLite 表进行比较?
【发布时间】:2019-02-16 03:09:30
【问题描述】:

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

因此,从某种意义上说,我希望返回用户给出的所有字符串值,无论它们是否与表值匹配。然而,匹配的值将有更多来自表的数据,而不匹配的值将只是值。

例如,我有一个 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','已完成'

它不会返回实际需要返回的不匹配值'Task 5'。

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

【问题讨论】:

    标签: android sqlite android-room


    【解决方案1】:

    不是直接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 策略。

    底线是输入列表必须“标记化”为单个元素,以便确定每个元素的状态。

    【讨论】:

    • :values...我已经通过编辑问题修复了代码。是的,我现在正在考虑手动将不匹配的结果添加到 SQL 结果中。而且我还在考虑首先将所有输入值添加到临时表中,然后使用 JOIN 获取结果。此类表的内容将在每次此类查询后被删除。感谢您抽出宝贵时间回复!
    猜你喜欢
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多