2016-08-03 9 views
1

In meiner Anwendung frage ich einige Daten aus Realm über die untere Modellklasse. Danach sortiere ich die resultierenden Daten mit realmResults.sort("point"). aber das Ergebnis ist nicht wie erwartet.Realm für Android - RealmResult.sort() String-basierte Sortierung tun?

Modellklasse

public class FreeItem extends RealmObject { 

private int itemId; 
private int point; 
private int freeQty; 
private int freeItemId; 

// geters setters 
} 

Code abfragen

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<>(); 

Vor Art (Debug-Werte)

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}] 

Nach Art ist es nach wie vor gleich.

Also habe ich versucht, eigenen Sortierprozess mit unter Code schreiben, aber es erzeugt eine Ausnahme und sagen, da sie Realm-Objekte nicht ersetzen können.

Irgendwelche Hilfe?

Code Sortierung

 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; 
      } 
     }); 

Exception

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) 

Antwort

4

Statt findAll() Methode verwenden, können Sie verwenden findAllSorted() und Sie können auch ASCENDING oder DESCENDING Auftrag.

Von Realm Dokumentation:

findAllSorted (java.lang.String [] Feldnamen, Sort [] sortOrders)

Findet alle Objekte, die die Abfragebedingungen und sortiert erfüllen von spezifischen Feldnamen.

Parameter:

Feldnamen - ein Array von Feldnamen nach sortieren.

sortOrders - So sortieren Sie die Feldnamen.

Rückgabe: ein RealmResults, das Objekte enthält. Wenn keine Objekte mit der Bedingung übereinstimmen, wird eine Liste mit null Objekten zurückgegeben.

Sie haben

plan.getDiscounts().where().equalTo("itemId", productId).findAllSorted("point",Sort.DESCENDING); 

statt

plan.getDiscounts().where().equalTo("itemId", productId).findAll(); 
realmResults.sort("point"); 

verwenden Ich hoffe, dass es für Sie arbeitet.

+0

Beste Antwort zum Sortieren von RealmResults. –