在Query中按顺序排序

时间:2018-06-15 08:41:07

标签: android kotlin android-room

我使用Room作为ORM。我希望通过特定的顺序从中获取一些对象的数组。我的代码如下所示:

@Query("SELECT * FROM `group` WHERE id IN (:ids) ORDER BY id in (:ids)")

但"按顺序排列"不行。我不想只按字段排序" id"。我想通过与数组" ids"相关的id对其进行排序。我的意思是:

我有一个整数ids = arrayOf(16,12,18,3)数组,我在上面的查询中使用它。在输出上我想要一些对象的数组(比如组)。输出数组将如下所示

    ListOf(Group(id:16, name: "someName"),
           Group(id: 12, name: "someAnotherName",
           Group(id: 18, name: "name"), 
           Group(id: 3, name: "another"))

3 个答案:

答案 0 :(得分:1)

您使用错误的方式,ORDER BY id in (:ids)不正确

应该是

@Query("SELECT * FROM `group` WHERE id IN (:ids) ORDER BY id")

答案 1 :(得分:1)

所以你离得很近。尝试使用

@Query("SELECT * FROM `group` WHERE id IN (:ids) ORDER BY id")

这对你有用。我不确定group

答案 2 :(得分:0)

要按照您想要的顺序从数据库中检索数据是不可能的,因为数据库不知道数组中当前索引的ID。实际上它是可能的,但您必须在查询中提供此信息或预先将其存储在表格中。

您真正想要的是通过某些ID获取相应的组信息,所以

  • 无需订购即可检索组数据

    @Query("SELECT * FROM group WHERE id IN (:ids)")
    fun getGroupsById(): List<Group>`
    
  • 将结果存储到map

    val idToGroups = mapOf<Long, Group>()
    for (group in getGroupsById()) {
        idToGroups[group.id] = group
    }
    
  • 然后在迭代初始ids数组时,按id

    获取相应的组
    for (id in ids) {
        // here group is related to each position in the array
        group = idToGroups[id]
        println("Id: ${id}, Name: ${group.name}")
    }