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知道吗?我在这里做了一个实验,你可以看看它是否适合你.
您可以使用limitRealm 5.6.0+.看起来像这样.
val myDataList = Realm.getDefaultInstance()
.where(MyData::class.java)
.limit(10)
.findAll()
Run Code Online (Sandbox Code Playgroud)
看看这个文件
正如@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)
| 归档时间: |
|
| 查看次数: |
11288 次 |
| 最近记录: |