【问题标题】:Android Room - Customize query to return certain value based on a conditionAndroid Room - 自定义查询以根据条件返回特定值
【发布时间】:2020-10-26 04:44:39
【问题描述】:

为了这个场景,我有一个user 表和两个表,其中每个user 可以是一种或两种类型,分别是friendfamily 表。如果用户存储在user 表中,这两个仅包含 id。

我正在尝试执行以下操作:

返回所有friendsfamily 的用户,按名称排序并按type 分组。

到目前为止,我几乎没有遇到任何问题,当我想在查询中按type 分组并在RecyclerView 中添加分隔符以区分用户是朋友和用户时,问题就出现了家庭。

我的意图是在查询本身中添加某种布尔值作为标志,从而区分在同一列表中返回的用户,但我很难找到任何类型的指导或示例如何做到这一点。

这是我正在尝试做的一个示例(不工作):

@Query("" +
    "SELECT " +
    "*, " +
    "table source? as type " + // here
    "FROM UserFamily " +
    "LEFT JOIN User " +
    "ON UserFamily.id = User.id " +
    "LEFT JOIN UserFriend " +
    "ON User.status = UserFriend.id " +
    "ORDER BY name ASC " +
    "GROUP BY ... table source? " // here
)

如何做到这一点?我知道我可以将所有不同的类型作为列添加到用户表中,然后对每个类型进行布尔运算,但这不是一个选项。

编辑:按要求提供样本数据

User

| id | first_name | age |
|:--:|:----------:|:---:|
|  1 |    Danny   |  28 |
|  2 |    Susan   |  15 |
|  3 |    Lenny   |  45 |

Friend表(id是属于User表的外键)

| id |
|:--:|
|  3 |

Family表(id是属于User表的外键)

| id |
|:--:|
|  1 |

期望的结果:

| id | first_name | age | type |
|:--:|:----------:|:---:|:----:|
|  1 |    Danny   |  28 |   1  |
|  3 |    Lenny   |  45 |   2  |

其中type 代表一个用户,该用户按 1 和 2 是家人或朋友,按 first_name 排序并按 type 分组。

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。
  • @GordonLinoff 恐怕我不明白你的要求,所以我尽我所能在我的编辑说明中尽力满足你的要求,如果你的意思是什么,请告诉我否则。

标签: android sql android-room


【解决方案1】:

我猜你想要的是像这样使用字段type

CASE 
  WHEN UserFamily.id IS NOT NULL THEN 1 // type = 1 means it's a family
  WHEN UserFriend.id IS NOT NULL THEN 2 // type = 2 means it's a friend
else 0 // type = 0 means it's neither family not friend
END as type

【讨论】:

  • 我不知道 Room 允许 CASE ... END 像这样使用 - 当然我在 SQL 中仍然很熟悉。我会试试这个,看看效果如何。
猜你喜欢
  • 2011-06-16
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多