【问题标题】:Sort by order in Query在Query中按顺序排序
【发布时间】:2018-11-25 02:02:53
【问题描述】:

我将 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"))

【问题讨论】:

标签: android kotlin android-room


【解决方案1】:

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

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

这应该适合你。我不确定group

【讨论】:

  • 这项工作。但不像我想要的那样工作。它按 ASC 排序。我想按特定位置对数组进行排序。 (如数组“ids”中的元素)
【解决方案2】:

你用错了方法,ORDER BY id in (:ids)不正确

应该是

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

【讨论】:

  • 这项工作。但不像我想要的那样工作。它按 ASC 排序。我想按特定位置对数组进行排序。 (就像数组“ids”中的元素)
  • 所以我认为你应该在 java/kotlin 代码中创建一个方法来做到这一点
  • 对我来说,这是不可能的(有你的条件),还有一点,我认为你应该更新你的问题,显然,正如你所说的,这将有助于其他人给出正确的答案
【解决方案3】:

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

你真正想要的,是通过一些id获取对应的group信息,所以

  • 检索组数据而不进行排序

    @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}")
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2019-01-07
    • 2013-08-24
    • 1970-01-01
    相关资源
    最近更新 更多