Realm findAllSorted by a field of a field

时间:2015-07-15 15:57:13

标签: java android realm

关于领域的另一个问题。

我有这个结构;

A类有一个B类,它有一个String名称。

我想按B b对A类列表进行排序,其名称为" xy";

所以这就是我尝试但不起作用的方式。

realm.where(A.class).findAllSorted("b.name",true);

这表示没有字段B.name。

任何想法我怎么能让它有效?

感谢。

2 个答案:

答案 0 :(得分:5)

Realm还不支持按链接排序。有open issue跟踪此内容。

以下是Realm支持该功能之前的解决方法:

class A extends RealmObject {
    private B b;
    // Storing the b.name as a field of A when calling setB(). But
    // remember you cannot do it by adding logic to setB() since Realm's
    // proxy will override the setters. You can add a static method to
    // achieve that.
    private String bName;

    // getters and setters

    // This needs to be called in a transaction.
    public static void setBObj(A a, B b) {
        a.setB(b);
        a.setBName(b.getName);
    }
}

然后你可以按bName对结果进行排序,如: realm.where(A.class).findAllSorted("bName",true);

答案 1 :(得分:1)

我同意@beeender,你也可以使用包装器来做java风格:

1.使用

定义A.class的包装器
public class AWrapper {
    public AWrapper(A a){
        this.a = a;
    }

    private A a;
}

2。转换包装器中的所有RealmObject。有人这样想:

List<AWrapper> wrapped = new ArrayList<>();
for(A a : realmSet){
   wrapped.add(new AWrapper(a))
}
  1. 实现自己的比较器以比较A.class

    中的某些字段
    private class OwnComparator implements Comparator<AWrapper>{
       @Override
       int compare(AWrapper o1, AWrapper o2) {
           return o1.someField.compareTo(o2.someField)
       }
    }
    
  2. 使用utils.Collections类进行排序

    Collections.sort(wrapped, new OwnComparator())