How can I set LIMIT in query in Realm?

半腔热情 提交于 2019-11-26 21:43:25

问题


I have done R&D for limit in query with no success. There is one way with which to paginate data in Realm with sub list but no success with that. It shows duplicate value in it.

Here is what I attempted for pagination.

 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(); 
}

What am I doing wrong?


回答1:


You can use limit from Realm 5.6.0+. It looks like this.

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

Look this document




回答2:


There is no reason to use pagination with Realm if you use RealmResults<T> directly, because the elements in RealmResults are lazy evaluated, and aren't in memory until you call .get(i).

Meaning, the query doesn't execute and evaluate an element until you directly index it. Which means, they aren't in memory. The RealmResults<T> list doesn't actually contain the elements, it just knows how to find them.

As such, there is no LIMIT in Realm.

Please note that if I remember correctly, reevaluating two RealmResults that are not returned by findAllSorted can have different ordering (if deletions occur). If the order must be the same no matter what, then consider a rank property, and order by findAllSorted("rank", Sort.ASCENDING).

If you really want pagination, you should have the rank parameters, and then you can create a query like

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

Also, you should consider using RealmRecyclerViewAdapter instead from here:

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

or

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

or

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

The RealmRecyclerViewAdapter handles "loading the new data" for you, you don't have to do anything to make it work beyond setting the initial RealmResults.



I'll actually have to change this answer once there is proper integration with the Paging Architecture Component, who knew? I have an experiment up with it here and you can see if it works for you.




回答3:


As @EpicPandaForce said, you can use lessThan()and greaterThan() to set the limit, but realm have between() method, check: https://realm.io/docs/java/latest/#chaining-queries

Example :

Just get items with limit 50 :

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

Or when I want to get last 10 items:

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);



回答4:


Now limit is supporting

I did that using limit method, You should use latest version 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.

`



来源:https://stackoverflow.com/questions/38873402/how-can-i-set-limit-in-query-in-realm

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!