我已经为查询中的限制做了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();
}
我做错了什么?
答案 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()
答案 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.
`