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

Piy*_*tel 3 android realm realm-list

我已经完成了查询限制的研发而没有成功.有一种方法可以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(); 
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Epi*_*rce 17

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

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

因此,LIMIT在Realm中没有.

请注意,如果我没记错的话,重新评估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);
Run Code Online (Sandbox Code Playgroud)

此外,你应该考虑RealmRecyclerViewAdapter这里使用:

compile 'io.realm:android-adapters:1.3.0' // for Realm 0.89.0 to Realm 2.3.0
Run Code Online (Sandbox Code Playgroud)

要么

compile 'io.realm:android-adapters:2.1.0' // for Realm 3.0.0+    
Run Code Online (Sandbox Code Playgroud)

要么

compile 'io.realm:android-adapters:3.0.0' // for Realm 5.0.0+    
Run Code Online (Sandbox Code Playgroud)

RealmRecyclerViewAdapter为您"处理新数据" 的句柄,除了设置初始值之外,您无需执行任何操作RealmResults.



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


khc*_*tro 6

您可以使用limitRealm 5.6.0+.看起来像这样.

val myDataList = Realm.getDefaultInstance()
    .where(MyData::class.java)
    .limit(10)
    .findAll()
Run Code Online (Sandbox Code Playgroud)

看看这个文件


Nab*_*lah 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);
Run Code Online (Sandbox Code Playgroud)

或者当我想获得最后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);
Run Code Online (Sandbox Code Playgroud)

  • 只有当所有id值以1(或0)开头的对象时,这才能正常工作.一旦开始删除对象,这将打破/导致比预期更少的项目. (5认同)