Android 如何在域中的查询中设置限制?

Android 如何在域中的查询中设置限制?,android,realm,realm-list,Android,Realm,Realm List,我做过极限查询的研发,但没有成功。有一种方法可以使用子列表对领域中的数据进行分页,但没有成功。它在其中显示重复的值 以下是我尝试分页的内容 RealmResults<Person> mPersonData=RealmUtils.getAllPersonWithTagsDescending(); if (mPersonData != null) { int startPos=getAllPerson.size()-1; int endPos=mPerso

我做过极限查询的研发,但没有成功。有一种方法可以使用子列表对
领域中的数据进行分页,但没有成功。它在其中显示重复的值

以下是我尝试分页的内容

 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 mPersonData=realmults.getAllPersonWithTagsDescending();
如果(mPersonData!=null){
int startPos=getAllPerson.size()-1;
int endPos=mPersonData.size()-1;
List newPersonData=mPersonData.subList(startPos,endPos);
getAllPerson.addAll(newPersonData);
mAdapter.notifyDataSetChanged();
}

我做错了什么?

如果直接使用
RealmResults
,没有理由对Realm使用分页,因为
RealmResults
中的元素是惰性计算的,并且在调用
之前不在内存中。get(I)

也就是说,在直接为元素编制索引之前,查询不会执行和计算元素。也就是说,它们不在内存中。
RealmResults
列表实际上并不包含元素,它只知道如何找到它们

因此,领域中没有
限制

请注意,如果我没记错的话,重新评估
findAllSorted
未返回的两个
RealmResults
,可能会有不同的顺序(如果发生删除)。如果顺序必须是相同的,那么就考虑一个<代码>秩< /代码>属性,并按<代码>查找排序(“秩”,排序,升序)< /C> > /P> 如果真的想要分页,那么应该有rank参数,然后可以创建如下查询

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

也应考虑使用:< /P> 或

RealmRecyclerViewAdapter
为您处理“加载新数据”,除了设置初始
RealmResults
之外,您无需做任何事情即可使其正常工作




一旦与分页体系结构组件进行了适当的集成,我就必须改变这个答案,谁知道呢?我对它做了一个实验,你可以看看它是否对你有效。

正如@EpicPandaForce所说,你可以使用
lessThan()
greaterThan()
来设置限制,但是如果你有
between()
方法,请检查:

示例:

只需获取限制为50的物品:

static int LIMIT = 50;
final RealmResults<Item> resultsFilter = realm.where(Item.class)
                .between("id", 0, LIMIT)
                .findAllSorted("id", Sort.ASCENDING);
static int LIMIT=50;
最终RealmResults resultsFilter=realm.where(Item.class)
.介于(“id”,0,限制)之间
.findAllSorted(“id”,排序升序);
或者当我想买最后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);
static int LIMIT=10;
final RealmResults resultsAll=realm.where(Item.class).findAll();
最终RealmResults resultsFilter=realm.where(Item.class)
.between(“id”,resultsAll.size()-LIMIT,resultsAll.size())
.findAllSorted(“id”,排序。降序);

您可以使用Realm 5.6.0+中的
限制。看起来像这样

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

现在极限正在支撑

我使用限制方法做到了这一点,您应该使用最新版本
classpath“io.realm:realm gradle plugin:5.8.0”

RealmResults RealmResults=mRealm.where(YourPOJOClass.class).sort(“createdTime”).limit(10.findAll();
//在此,此记录将使用架构名称“createdTime”按升序排序
//这将仅返回10行。

`

为什么需要限制查询?@param他可能不需要限制查询,因为领域是如何工作的。他似乎还不知道。Hi@param我需要同步API和数据库中的数据,所以在从API加载更多数据时,我面临数据重复的问题。您可能应该指定您的事务。为了在事务中设置一致的结果,您需要使用rank参数,就像paginate和replications之间没有关系一样。只有在所有id值都从1(或0)开始的情况下,该参数才能正常工作。一旦开始删除对象,这将中断/导致项目少于预期。我添加了它,但无法在realm中使用limit()。我使用了实现“io.realm:realm android:0.81.1”这个插件级build.gradle文件
static int LIMIT = 50;
final RealmResults<Item> resultsFilter = realm.where(Item.class)
                .between("id", 0, LIMIT)
                .findAllSorted("id", Sort.ASCENDING);
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);
val myDataList = Realm.getDefaultInstance()
    .where(MyData::class.java)
    .limit(10)
    .findAll()
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.