2017-03-20 10 views
1

をスローし、私がjava.lang.UnsupportedOperationExceptionがをスローソートカスタムを持っていますそれは、このようなリストコレクションに座っているので、私は、レルムのデータベースからそれをretreivedた後:レルムはカスタムの並べ替えのAndroid用のレルムを使用するにUnsupportedOperationException

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

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

DistanceComparatorは次のようになります私がデータの一時的な性質にレルム内ソートを実行することはできません

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) 

:私は、ソートを実行すると0

はしかし、私は取得しています。

Realmデータを持つコレクションに対して基本ソートを実行できませんか、この種の並べ替えを実行するためにRealmObjectであるクラスに何らかのアノテーションを追加する必要がありますか?

私はこの質問を見ていたし、これは動作しませんならば、それは私のフォールバックです:How do you sort a RealmList or RealmResult by distance?

+0

さてあなたは、ソート、RealmObject( 'findAllSorted( "距離" でのフィールドのソート条件としてソートを設定することができますいずれかであります.ASCENDING) ')するか、すべての要素をコピーアウトする必要があります。 – EpicPandaForce

答えて

0

カスタムRealmResultにソートを実行することはできません。結果は管理対象外のListにコピーし、領域結果の代わりにその結果を使用する必要があります。

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

つまり、私が言及したスタックオーバーフローリンクで回答されたバックアップ計画。確認していただきありがとうございます。 –

0

あなたはRealmObject自体の一部であることをLocationUtilによって評価値を移動することを検討し、レルムによるソートを行うことができます。

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

(バージョン0.88.0以上で動作しますが、最近では0.87.5以下で動作しますか?レルムは3.0.0です) – EpicPandaForce

+0

残念ながら、私はsetLocationをコードが処理されている場所では不可能なトランザクション。 –

+0

ああ、それは残念です。 'copyFromRealm()'それは、 – EpicPandaForce

関連する問題