簡體   English   中英

使用領域更新嵌套列表

[英]Update nested lists with realm

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

copyToRealmOrUpdate

公共java.util.List copyToRealmOrUpdate(java.lang.Iterable對象)

更新由其PrimaryKey標識的現有RealmObjects的列表,如果找不到現有對象,則創建一個新副本。

確保在主表中包含PrimaryKey ,以使copyToRealmOrUpdate正常工作。

從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%到對10萬個對象快約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());
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM