如何确保根据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);
答案 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);