使用领域更新嵌套列表

时间:2017-02-26 21:13:26

标签: java android realm retrofit2

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

1 个答案:

答案 0 :(得分:0)

<强> copyToRealmOrUpdate

  

public java.util.List   copyToRealmOrUpdate(java.lang.Iterable objects)

更新由RealmObjects标识的现有PrimaryKey列表,或者如果找不到现有对象,则创建新副本。

确保PrimaryKey主表中有copyToRealmOrUpdate coulmn才能正常工作。

自Realm v1.1.0以来,他们提出了一些优化,现在提供4种新方法,你可以使用它

  • void Realm.insert(RealmModel obj)
  • void Realm.insert(Collection collection)
  • void Realm.insertOrUpdate(RealmModel obj)
  • void Realm.insertOrUpdate(Collection collection)

这些方法与标准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());
    }
});