如何在Realm中的查询中设置LIMIT?

时间:2016-08-10 12:26:12

标签: android realm realm-list

我已经为查询中的限制做了R& D但没有成功。有一种方法可以在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 个答案:

答案 0 :(得分:17)

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

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

因此,Realm中没有LIMIT

请注意,如果我没记错的话,重新评估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来代替here

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之外,您无需执行任何操作。

一旦与Paging Architecture Component正确集成,我真的必须改变这个答案,Paging Architecture Component知道吗?我有一个实验here,你可以看看它是否适合你。

答案 1 :(得分:6)

您可以使用Realm 5.6.0+中的limit。看起来像这样。

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

this document

答案 2 :(得分:5)

正如@EpicPandaForce所说,您可以使用lessThan()greaterThan()设置限制,但领域有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);

答案 3 :(得分: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.

`