如何在 Realm 的查询中设置 LIMIT?
How can I set LIMIT in query in Realm?
我已经对查询限制进行了研发,但没有成功。有一种方法可以使用子列表对 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();
}
我做错了什么?
如果您直接使用 RealmResults<T>
,则没有理由在 Realm 中使用分页,因为 RealmResults
中的元素是惰性求值的,并且在您调用 [=16= 之前不在内存中].
意思是,在您直接索引元素之前,查询不会执行和计算元素。这意味着,它们不在内存中。 RealmResults<T>
列表实际上 不包含 元素,它只知道如何找到它们。
因此,Realm 中没有 LIMIT
。
请注意,如果我没记错的话,重新计算 findAllSorted
未返回的两个 RealmResults
可能会有不同的顺序(如果发生删除)。如果无论如何顺序都必须相同,则考虑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
instead from 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
会为您处理 "loading the new data",除了设置初始 RealmResults
.
之外,您无需执行任何操作即可使其正常工作
一旦与分页架构组件正确集成,我实际上必须更改此答案,谁知道呢?我做了一个实验 here,你可以看看它是否适合你。
正如@EpicPandaForce所说,你可以使用lessThan()
和greaterThan()
来设置限制,但是realm有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);
您可以使用 Realm 5.6.0+ 中的 limit
。看起来像这样。
val myDataList = Realm.getDefaultInstance()
.where(MyData::class.java)
.limit(10)
.findAll()
现在支持限价
我用限制方法做到了, 你应该使用最新版本 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.
`
我已经对查询限制进行了研发,但没有成功。有一种方法可以使用子列表对 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();
}
我做错了什么?
如果您直接使用 RealmResults<T>
,则没有理由在 Realm 中使用分页,因为 RealmResults
中的元素是惰性求值的,并且在您调用 [=16= 之前不在内存中].
意思是,在您直接索引元素之前,查询不会执行和计算元素。这意味着,它们不在内存中。 RealmResults<T>
列表实际上 不包含 元素,它只知道如何找到它们。
因此,Realm 中没有 LIMIT
。
请注意,如果我没记错的话,重新计算 findAllSorted
未返回的两个 RealmResults
可能会有不同的顺序(如果发生删除)。如果无论如何顺序都必须相同,则考虑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
instead from 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
会为您处理 "loading the new data",除了设置初始 RealmResults
.
一旦与分页架构组件正确集成,我实际上必须更改此答案,谁知道呢?我做了一个实验 here,你可以看看它是否适合你。
正如@EpicPandaForce所说,你可以使用lessThan()
和greaterThan()
来设置限制,但是realm有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);
您可以使用 Realm 5.6.0+ 中的 limit
。看起来像这样。
val myDataList = Realm.getDefaultInstance()
.where(MyData::class.java)
.limit(10)
.findAll()
现在支持限价
我用限制方法做到了, 你应该使用最新版本 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.
`