在我的应用程序中,我正在从领域查询有关以下模型类的一些数据。之后,我将使用排序结果数据realmResults.sort("point")
。但是结果却不如预期。
模型类
public class FreeItem extends RealmObject {
private int itemId;
private int point;
private int freeQty;
private int freeItemId;
// geters setters
}
Run Code Online (Sandbox Code Playgroud)
查询代码
if(realm==null||realm.isClosed()){
realm = Realm.getInstance(config);
}
PromotionPlan plan = realm.where(PromotionPlan.class).equalTo("id", planId).findFirst();
if(plan!=null) {
RealmResults<QtyDiscount> realmResults = plan.getDiscounts().where().equalTo("itemId", productId).findAll();
realmResults.sort("point");
return realmResults.subList(0,realmResults.size());
}
return new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
排序前(调试值)
FreeItem = [{itemId:61},{point:12},{freeQty:1},{freeItemId:61}]
FreeItem = [{itemId:61},{point:120},{freeQty:16},{freeItemId:61}]
FreeItem = [{itemId:61},{point:24},{freeQty:3},{freeItemId:61}]
FreeItem = [{itemId:61},{point:60},{freeQty:8},{freeItemId:61}]
Run Code Online (Sandbox Code Playgroud)
排序后与以前相同。
因此,我尝试使用下面的代码编写自己的排序过程,但是由于它们是领域对象而无法替换,因此生成了一个异常并说。
有什么帮助吗?
排序码
List<FreeItem> result = realmResults.subList(0, realmResults.size());
Collections.sort(result, new Comparator<FreeItem>() {
@Override
public int compare(FreeItem lhs, FreeItem rhs) {
if(lhs.getPoint()>rhs.getPoint())return 1;
if(lhs.getPoint()<rhs.getPoint())return -1;
return 0;
}
});
Run Code Online (Sandbox Code Playgroud)
例外
java.lang.UnsupportedOperationException: Replacing and element is not supported.
at io.realm.RealmResults$RealmResultsListIterator.set(RealmResults.java:826)
at io.realm.RealmResults$RealmResultsListIterator.set(RealmResults.java:757)
at java.util.AbstractList$SubAbstractList$SubAbstractListIterator.set(AbstractList.java:232)
at java.util.Collections.sort(Collections.java:1888)
Run Code Online (Sandbox Code Playgroud)
findAll()
可以使用findAllSorted()代替使用方法,也可以给定ASCENDING
或DESCENDING
排序。
从Realm文档:
findAllSorted(java.lang.String [] fieldNames,Sort [] sortOrders)
查找满足查询条件并按特定字段名称排序的所有对象。
参数:
fieldNames-要排序的字段名称数组。
sortOrders-如何对字段名称进行排序。
返回:包含对象的RealmResults。如果没有对象符合条件,则返回包含零个对象的列表。
你必须用
plan.getDiscounts().where().equalTo("itemId", productId).findAllSorted("point",Sort.DESCENDING);
Run Code Online (Sandbox Code Playgroud)
代替
plan.getDiscounts().where().equalTo("itemId", productId).findAll();
realmResults.sort("point");
Run Code Online (Sandbox Code Playgroud)
我希望这个对你有用。
归档时间: |
|
查看次数: |
3250 次 |
最近记录: |