2016-02-26 259 views
2

我已經開始使用Realm了,我很好奇如果可以通過嵌套屬性對RealmList對象進行排序。如何使用嵌套屬性對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 
     } 
}); 

,但我不知道這是一個正確的做法。

+1

對不起,境界不支持孩子的財產排序,現在:(見https://github.com/realm/realm-java/issues/709,你的副作用臨時解決方案是排序需要在Realm事務中運行,並且在Realm中實際的'RealmList''項目將在排序後被更改。也許你想要創建一個新的集合並對其進行排序。 – beeender

回答

0

我有同樣的問題,我解決了這個用同樣的方式,使用上RealmList

集合

我的某種需要字母順序排序是嵌套在主對象的RealmList列表的名稱

//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這裏我把結果

希望這有助於。

1

貢薩洛的方法現在看起來不錯。但是由於訪問嵌套的項目會導致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; 
    } 
}); 
相關問題