【问题标题】:Realm Custom Sort throws UnsupportedOperationException领域自定义排序抛出 UnsupportedOperationException
【发布时间】:2020-11-19 21:47:08
【问题描述】:

在 Android 上使用 Realm,我有一个自定义排序,它会抛出 java.lang.UnsupportedOperationException:不支持替换和元素

所以,我有一条数据需要在从 Realm 数据库中检索后对其进行排序,所以它位于这样的 List 集合中:

Collections.sort(stores, new DistanceComparator(currentLocation));

DistanceComparator 如下所示:

public class DistanceComparator implements Comparator<Restaurant> {
    private Location currentLocation;

    public DistanceComparator(Location location) {
        currentLocation = location;
    }

    public int compare(RealmObject c1, RealmObject c2) {
        if ((LocationUtil.calculateSomeValue(c1.getLocation()))
            == (LocationUtil.calculateSomeValue(c2.getLocation()))) {
            return 0;
        }
        else if ((LocationUtil.calculateSomeValue(c1.getLocation()))
            < (LocationUtil.calculateSomeValue(c2.getLocation()))) {
            return -1;
        }
        else {
            return 1;
        }
    }
}

但是,当我执行排序时,我得到一个:

java.lang.UnsupportedOperationException: Replacing and element is not supported.                                                                              
    at io.realm.RealmResults$RealmResultsListIterator.set(RealmResults.java:868)
    at io.realm.RealmResults$RealmResultsListIterator.set(RealmResults.java:799)
    at java.util.Collections.sort(Collections.java:247)

由于数据的瞬态性,我无法在 Realm 中执行排序。

你不能对碰巧有 Realm 数据的集合执行基本排序,还是我需要在 RealmObject 类中添加某种注释才能执行这种类型的排序?

我确实看过这个问题,如果这不起作用,那是我的后备:How do you sort a RealmList or RealmResult by distance?

【问题讨论】:

  • 您可以将排序设置为 RealmObject (findAllSorted("distance", Sort.ASCENDING)) 中某个字段的排序条件,或者您需要复制所有元素。

标签: android realm


【解决方案1】:

您无法对RealmResult 执行自定义排序。您必须将结果复制到非托管 List 并使用它而不是领域结果。

List<ModelMyFlirtsItem> storesList = realm.copyFromRealm(stores);
Collections.sort(storesList, new DistanceComparator(currentLocation));

【讨论】:

  • 因此,换句话说,就是我提到的 Stack Overflow 链接中回答的备份计划。感谢您的确认。
  • 我想知道,如果某个对象将从领域中删除,List 不会改变它自己的大小吗?或者它仍然在列表中,只是无效?还是会有空?
【解决方案2】:

您可以考虑将LocationUtil 评估的值移动到RealmObject 本身,并按Realm 进行排序。

public int compare(RealmObject c1, RealmObject c2) {
    if ((LocationUtil.calculateSomeValue(c1.getLocation()))
        == (LocationUtil.calculateSomeValue(c2.getLocation()))) {
        return 0;
    }
    else if ((LocationUtil.calculateSomeValue(c1.getLocation()))
        < (LocationUtil.calculateSomeValue(c2.getLocation()))) {
        return -1;
    }
    else {
        return 1;
    }
}

可能

public class RealmObject extends RealmObject {
    private Integer distance;
    private Location location;

    public void setLocation(Location location) {
        if(location == null) {
            this.distance = null;
        } else {
            this.distance = LocationUtil.calculateSomeValue(location);
        }
        this.location = location;
    }
}

然后

RealmResults<RealmObject> results = realm.where(RealmObject.class).findAllSorted("distance", Sort.ASCENDING);

【讨论】:

  • (工作版本0.88.0及以上,但最近到底有谁在使用0.87.5及以下?Realm在3.0.0
  • 不幸的是,这行不通,因为我必须在一个事务中执行 setLocation,而这在处理代码的地方是不可能的。
  • 啊,真可惜。 copyFromRealm() 是,那么
【解决方案3】:

RealmResults 中使用排序时,我也遇到了这个问题。我只是使用Realm 的本机.sort() 函数解决了它。比如——

RealmResult<Location> stores......;
 .......
 .......
 stores.sort(new DistanceComparator(currentLocation));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2014-01-30
    • 1970-01-01
    • 2015-01-19
    相关资源
    最近更新 更多