Android领域– RealmResult.sort()在执行基于字符串的排序?

use*_*322 1 android realm

在我的应用程序中,我正在从领域查询有关以下模型类的一些数据。之后,我将使用排序结果数据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)

Raj*_*esh 5

findAll()可以使用findAllSorted()代替使用方法,也可以给定ASCENDINGDESCENDING排序。

从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)

我希望这个对你有用。