2017-02-26 100 views
0

我在我的Android應用程序中使用領域和改進。我試圖更新從服務器獲得的JSON。 JSON包含列表中的列表。而領域不會將新數據添加到領域數據庫。使用領域更新嵌套列表

我第一次使用realm.copyToRealmOrUpdate正確的數據被添加。但如果我第二次嘗試相同的JSON包含新的triggeringZones這些區域不會被添加。我需要重新安裝要添加的區域的應用程序。

任何人都有關於如何使用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的列表,或者在未找到現有對象的情況下創建新副本。

請確保PrimaryKey coulmn在copyToRealmOrUpdate的主表中工作。

由於境界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()); 
    } 
});