如何使用嵌套属性对RealmList对象进行排序?

时间:2016-02-26 12:56:46

标签: android sorting realm

我已经开始使用Realm,我很好奇是否可以通过嵌套属性对RealmList对象进行排序。

我有一些ListModel对象:

public class ListModel extends RealmObject {

   @Required
   private String itemName;
   ...
   private RealmList<ItemModel> items;
   ...
}

ItemModel是:

public class ItemModel extends RealmObject {

   private TagModel tag;
   ...
   private boolean isBought = false;

   @PrimaryKey
   private long created;
   ...
}

TagModel是:

public class TagModel extends RealmObject {

   @PrimaryKey
   private String tagName;
   ...
   private CategoryModel category;
   ...
}

和CategoryModel是:

public class CategoryModel extends RealmObject {

   @PrimaryKey
   private int categoryType;
   ...
}

所以,我真正需要的是拥有这样的东西:

RealmResults<ItemModel> sortedItems= realm.where(ListModel.class)
            .equalTo("created", created)
            .findFirst().getItems().where().findAllSorted("isBought", Sort.ASCENDING, "tag.category.categoryType", Sort.ASCENDING, "tag.tagName", Sort.ASCENDING);

有可能以某种方式实现这一目标吗?就目前而言,据我所知,根据我的需要,不可能使用以下结构"tag.category.categoryType"

作为临时解决方案,我正在考虑以下方法:

ListModel listModel = realm.where(ListModel.class)
      .equalTo("created", created)
      .findFirst();

List<ItemModel> items = listModel.getItems();
Collections.sort(items, new Comparator<ItemModel>() {
      @Override
      public int compare(ItemModel lhs, ItemModel rhs) {
            // here some sorting logic
      }
});

但我不确定这是否正确。

2 个答案:

答案 0 :(得分:1)

Gonzalo的方法现在看起来不错。但它有点慢,因为访问嵌套项会导致I / O. 在我的情况下,10000件物品大约需要30秒。 所以我对它进行了改进以使用缓存。

Collections.sort(medicineClassList, new Comparator<MedicineClass>() {
    Map<String, String> primaryKey2SortKey = new HashMap();
    @Override
    public int compare(MedicineClass lmo, MedicineClass rmo) {
        String lmo_string = pullSortKey(lmo);
        String rmo_string = pullSortKey(rmo);
        return lmo_string.compareToIgnoreCase(rmo_string);
    }

    private String pullSortKey(MedicineClass item) {
        if (primaryKey2SortKey.containsKey(item.getPrimaryKey())) {
            return primaryKey2SortKey.get(item.getPrimaryKey());
        }
        String sortKey = item.getProduct_request().getProduct().getName();
        primaryKey2SortKey.put(item.getPrimaryKey(), sortKey);
        return sortKey;
    }
});

答案 1 :(得分:0)

我有同样的问题,我用同样的方法解决了这个问题,使用RealmList上的Collections

我需要按字母顺序排列嵌套在主对象中的RealmList上的List的名称

//medicineClassList is a RealmList with some RealmObjects

Collections.sort(medicineClassList, new Comparator<MedicineClass>() {
    @Override
    public int compare(MedicineClass lmo, MedicineClass rmo) {
        String lmo_string = lmo.getProduct_request().getProduct().getName();
        String rmo_string = rmo.getProduct_request().getProduct().getName();

        return lmo_string.compareToIgnoreCase(rmo_string);
    }
});

那么我在自定义适配器中使用medicineClassList来设置ListView,我把结果放在哪里

希望这有帮助。