2017-02-26 69 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()); 
    } 
});