2017-02-26 6 views
0

私は領域を使用し、私のAndroid Appにレトロフィットします。私はJSONをサーバーから更新しようとしています。 JSONにはリストが含まれています。また、領域は新しいデータを領域データベースに追加することはありません。領域を含むネストされたリストを更新する

最初にrealm.copyToRealmOrUpdateを使用して、正しいデータが追加されます。しかし、JSONに新しいtriggeringZonesが含まれている同じ2回目を試してみると、これらのゾーンは追加されません。私はゾーンを追加するためにアプリケーションを再インストールする必要があります。

誰でもリストのリストにcopyToRealmOrUpdateを使用する方法の手掛かりがありますか、それとも他の選択肢がありますか?

例クラス:

public class Zones { 
    public List<Zone> 
} 

public class Deals { 
    public List<AffectingZones> 
} 

public class AffectingZones { 

} 

例JSON

{ 
    "transactionId": "string", 
    "status": "SUCCESS", 
    "statusDescription": "string", 
    "triggeringZones": [ 
    { 
     "id": 0, 
     "name": "string", 
     "description": "string", 
     "longitude": 0, 
     "latitude": 0, 
     "radius": 0, 
     "deals": [ 
     { 
      "id": 0, 
      "description": "string", 
      "principle": "ALL", 
      "affectingZones": [ 
      { 
       "id": 0, 
       "name": "string", 
       "description": "string", 
       "longitude": 0, 
       "latitude": 0, 
       "radius": 0 
      } 
      ], 
      "triggeringZone": { 
      "id": 0, 
      "name": "string", 
      "description": "string", 
      "longitude": 0, 
      "latitude": 0, 
      "radius": 0 
      } 
     } 
     ] 
    } 
    ] 
} 
+0

は 'Zones'は、' Deals'と 'AffectingZones'は' RealmObject'を拡張してください:これは、それを保存からのデータを表示区切るしたいというあなたのそれらのための巨大な利益になることができますか? – Dalinaum

答えて

0

copyToRealmOrUpdate

公共java.util.Listに copyToRealmOrUpdate(java.lang.Iterableオブジェクト)

PrimaryKeyで識別される既存のRealmObjectsのリストを更新するか、既存のオブジェクトが見つからない場合は新しいコピーを作成します。

copyToRealmOrUpdateが動作するためには、メインテーブルにPrimaryKey coulmnがあることを確認してください。

レルムv1.1.0デベロッパーは、彼らはいくつかの最適化を思い付いた、今4つの新しい方法を提供しますので、代わりにあなたはそれを利用することができます

  • 無効Realm.insert(RealmModelのOBJ)
  • 無効Realm.insert(コレクションコレクション)
  • 無効Realm.insertOrUpdate(RealmModelのOBJ)
  • 無効Realm.insertOrUpdate(コレクションコレクション)

これらのメソッドは、オブジェクトが返されないという意味で、標準でRealm.copyToRealm()とほとんど異なります。これにより、メモリー割り当てをほとんどゼロにすることができ、純粋なオーバーヘッドであった多くのチェックを削除することができました。

これを実行すると、最適化されたSQLiteの実装より約40%遅くなり、100Kオブジェクトで約70%高速になりました。

Realmの自動更新機能により、データが保存される前に照会することが可能で、データが利用可能になったときに通知を受けることに注意してください。

final PersonApi api = new PersonApi(); 
Realm realm = Realm.getDefaultInstance(); 
RealmResults<Person> persons = realm.where(Person.class).findAllAsync(); 
person.addChangeListner(new RealmChangeListener() { 
    @Override 
    public void onChange(RealmResults<Person> persons) { 
     if (!persons.isEmpty()) { 
     // Callback when data is available 
     } 
    } 
}); 

realm.executeTransactionAsync(new Realm.Transaction() { 
    @Override 
    public void execute(Realm realm) { 
     realm.insertOrUpdate(api.getPersons()); 
    } 
}); 
関連する問題