【问题标题】:Realm Android: order by id-listRealm Android:按 id-list 排序
【发布时间】:2017-09-14 14:23:00
【问题描述】:

如何确保RealmResult 是根据 ids 整数数组的排序顺序进行排序的?

   public static RealmResults<ContentPage> getContentPages(Realm realm, Integer[] ids) {

        return realm.where(ContentPage.class)
               .in(ContentPage.FIELD_ID, ids).findAll();
   }

所以我正在寻找一种方法来根据它们在 ids 数组中的 id 位置对 ContentPage 对象进行排序。

我没有将此RealmResult 转换为列表,它是一个自动托管对象,因此在检索后我无法在其上运行正常的Comparator

*EDIT:如果我尝试在 RealmResult 上使用普通比较器,我会得到:UnsupportedOperationException:不支持替换和元素。

*EDIT 2:我的问题似乎不清楚:如果我有这样的 ids 数组:[3,1,2]。这进入上面的.in(ContentPage.FIELD_ID, ids)。我希望 RealmResult 的顺序是:id 为 3 的项目,然后是 1,最后是 2。

*EDIT 3:通过每次更改时从 RealmResult 创建一个新的 ArrayList(使用 Realm ChangeListener)并在我的应用程序中进一步使用它来修复。您可以对这个复制的数组进行排序。不理想,只是一个临时解决方案。

List copiedList = new ArrayList<>(getPagesResult);
Collections.sort(copiedList, comparator);

【问题讨论】:

  • 但是 RealmResults 已经有了 .sort() 方法,所以不需要转换为数组,否则我完全迷路了,不能让你好起来 xD
  • :) 如上所示,运行 RealmResult 的 .sort() 方法会给出“UnsupportedOperationException:不支持替换和元素。”

标签: android realm


【解决方案1】:

结论:Realm 不支持。

可以通过在每次更改时从RealmResult 创建一个新的ArrayList(使用RealmChangeListener)并在应用程序中使用它来解决此问题。您可以对这个复制的数组进行排序。不理想,但可行的解决方案。

List copiedList = new ArrayList<>(getPagesResult);
Collections.sort(copiedList, comparator);

如果您使用的是RealmRecyclerViewAdapter,这将不起作用,您需要RealmResult。此外,此解决方案消除了使用 RealmResults 的其他细节。

【讨论】:

    【解决方案2】:

    只需使用 findAllSorted:

    return realm.where(ContentPage.class)
               .in(ContentPage.FIELD_ID, ids).findAllSorted("id",Sort.DESCENDING);
    

    【讨论】:

    • 有人已经将此作为答案发布。不用再说了
    • 他比我快:D
    • 不,我正在寻找:“基于 ids 整数数组的排序顺序排序”,因此与“in(...)”顺序相比。 id 可以按任何东西排序。
    • @Frank 根据documentation这个会被排序取回,取完后不会排序。
    • 我更新了我的问题,也许这更清楚了。您的答案将按 id 整数对结果进行排序,而不是按 ids 列表中的排序顺序。
    【解决方案3】:

    您可以在查询结束时将findAll(); 替换为findAllSorted();`

    .findAllSorted(ContentPage.FIELD_ID, Sort.ASCENDING);
    

    【讨论】:

    • 不,我正在寻找:“基于 ids 整数数组的排序顺序排序”,因此与“in(...)”顺序相比。 id 可以按任何东西排序
    【解决方案4】:

    说实话?

    return realmResults.get(sortArray[i-1]-1);
    

    【讨论】:

    • 只检索一项?
    • 只要你有你的“排序数组”,你就可以得到其中的任何一个。
    • 我想对 RealmResult 进行排序。不复制清单,不将项目一一取出并放入新清单。显然,您无法在查询完成后对其进行排序,而无需复制到新列表中,因此我正在寻找一种方法来更新查询,使其在查询中根据 id 列表对检索项目进行排序。我想这是不可能的。
    • 除非您将字段的值设置为排序顺序,然后对其进行升序排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    相关资源
    最近更新 更多