4

我已经为查询限制进行了研发,但没有成功。有一种方法可以Realm使用子列表对数据进行分页,但没有成功。它在其中显示重复值。

这是我尝试进行分页的内容。

 RealmResults<Person> mPersonData=RealmUtils.getAllPersonWithTagsDescending(); 
    if (mPersonData != null) { 
    int startPos=getAllPerson.size()-1; 
    int endPos=mPersonData.size()-1; 
    List<Person> newPersonData=mPersonData.subList(startPos,endPos);   
    getAllPerson.addAll(newPersonData); 
    mAdapter.notifyDataSetChanged(); 
}

我究竟做错了什么?

4

4 回答 4

19

如果您RealmResults<T>直接使用 Realm,则没有理由使用分页,因为其中的元素RealmResults是惰性求值的,并且在您调用.get(i).

这意味着,在您直接索引元素之前,查询不会执行和评估元素。这意味着,它们不在内存中。该RealmResults<T>列表实际上并不包含元素,它只知道如何找到它们。

因此,LIMITRealm 中没有。

请注意,如果我没记错的话,重新评估两个RealmResults未返回的findAllSorted可能有不同的顺序(如果发生删除)。如果无论如何顺序都必须相同,则考虑一个rank属性,并按顺序排序findAllSorted("rank", Sort.ASCENDING)

如果你真的想要分页,你应该有排名参数,然后你可以创建一个查询

realm.where(SomeClass.class)
     .greaterThanOrEqualTo("rank", pageSize*pageIndex + 0)
     .lessThan(SomeClassFields.RANK, pageSize*pageIndex + pageSize)
     .findAllSorted(SomeClassFields.RANK, Sort.ASCENDING);

此外,您应该考虑RealmRecyclerViewAdapter这里改用:

compile 'io.realm:android-adapters:1.3.0' // for Realm 0.89.0 to Realm 2.3.0

或者

compile 'io.realm:android-adapters:2.1.0' // for Realm 3.0.0+    

或者

compile 'io.realm:android-adapters:3.0.0' // for Realm 5.0.0+    

句柄为您“RealmRecyclerViewAdapter加载新数据”,除了设置初始RealmResults.



一旦与分页架构组件正确集成,我实际上必须更改此答案,谁知道?我在这里做了一个实验,你可以看看它是否适合你。

于 2016-08-10T12:30:43.973 回答
11

您可以limit从 Realm 5.6.0+ 开始使用。它看起来像这样。

val myDataList = Realm.getDefaultInstance()
    .where(MyData::class.java)
    .limit(10)
    .findAll()

这个文件

于 2018-11-12T11:30:35.620 回答
4

正如@EpicPandaForce 所说,您可以使用lessThan()andgreaterThan()设置限制,但领域有between()方法,请检查:https ://realm.io/docs/java/latest/#chaining-queries

例子 :

只需获取限制为 50 的项目:

static int LIMIT = 50;
final RealmResults<Item> resultsFilter = realm.where(Item.class)
                .between("id", 0, LIMIT)
                .findAllSorted("id", Sort.ASCENDING);

或者当我想获得最后 10 件物品时:

static int LIMIT = 10;
final RealmResults<Item> resultsAll = realm.where(Item.class).findAll();
final RealmResults<Item> resultsFilter = realm.where(Item.class)
                .between("id", resultsAll.size() - LIMIT, resultsAll.size())
                .findAllSorted("id", Sort.DESCENDING);
于 2017-06-06T13:28:55.950 回答
1

现在限制支持

我使用限制方法做到了, 你应该使用最新版本 classpath "io.realm:realm-gradle-plugin:5.8.0"

RealmResults<YourPOJOClass> realmResults = mRealm.where(YourPOJOClass.class).sort("createdTime").limit(10).findAll();
//here this record will be sorted by ascending order using schema name "createdTime" 
//this will return the 10 rows only.

`

于 2018-12-21T12:31:10.570 回答