Realm Android:按id-list

时间:2017-09-14 14:23:00

标签: android realm

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

   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

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

*编辑2 :我的问题似乎不清楚:如果我有这样的ID数组:[3,1,2]。这进入上面的.in(ContentPage.FIELD_ID, ids)。我希望RealmResult按顺序排列:首先是id 3,之后是1,最后是2的项目。

*编辑3 :通过每次更改时使用RealmResult创建一个新的ArrayList(使用Realm ChangeListener)并在我的应用程序中进一步使用它来解决。您可以对此复制的数组进行排序不理想,但暂时解决。

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

4 个答案:

答案 0 :(得分:2)

结论:Realm不支持。

可以通过每次更改(使用ArrayList)并在应用中使用RealmResult时从RealmChangeListener创建新的List copiedList = new ArrayList<>(getPagesResult); Collections.sort(copiedList, comparator); 来解决此问题。您可以对此复制的数组进行排序不理想,但是一个有效的解决方案。

RealmRecyclerViewAdapter

如果您使用的是RealmResult,那么这项工作仍然无法完成,您需要RealmResults。此外,此解决方案还消除了使用 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUNCTION [dbo].[RemoveSpecialChars] (@s VARCHAR(2000)) RETURNS VARCHAR(2000) WITH SCHEMABINDING BEGIN IF @s IS NULL RETURN NULL DECLARE @s2 VARCHAR(256) SET @s2 = '' DECLARE @l INT SET @l = LEN(@s) DECLARE @p int SET @p = 1 WHILE @p <= @l BEGIN DECLARE @c INT SET @c = ASCII(SUBSTRING(@s, @p, 1)) IF @c BETWEEN 65 AND 90 OR @c BETWEEN 97 AND 122 OR @c = 64 OR @c = 46 SET @s2 = @s2 + CHAR(@c) SET @p = @p + 1 END IF LEN(@s2) = 0 RETURN NULL RETURN @s2 END 的其他细节。

答案 1 :(得分:0)

您可以在查询结尾处将findAll();替换为findAllSorted();

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

答案 2 :(得分:0)

只需使用findAllSorted:

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

答案 3 :(得分:0)

实话?

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