【问题标题】:Realm: update of the part RLMArrayRealm:更新部分 RLMArray
【发布时间】:2015-12-21 09:38:40
【问题描述】:

我在我的应用程序中使用 Realm,但我遇到了一些问题。 服务器返回应该在我的数据库中更新的数据。例如:

{ projects:[{ id:1, name:project1, floors:[ { id:1, name:floor1} ]  }]}

它说我应该更新项目中 id=1 的 namefloors 字段。如果数据库中的项目有floor id=1,那么应该更新它,否则应该添加。但它不应该从地板阵列中删除其他对象。 我做了什么:

Project *project = [Project projectFromDictionary:dictionary];
[realm beginWriteTransaction];
[Project createOrUpdateInDefaultRealmWithValue:project];
[realm commitWriteTransaction];

但此代码删除了我项目中的其他楼层。我该怎么办?

项目类:

 @interface Project:RLMObject
 @property NSString *name;
 @property NSString *projectID;
 @property RLMArray<Floor *><Floor> *floors;
 @end

楼层:

 @interface Floor:RLMObject
 @property NSString *name;
 @property NSString *floorID;
 @end
 RLM_ARRAY_TYPE(Floor)

【问题讨论】:

    标签: objective-c realm


    【解决方案1】:

    如果您使用+[RLMObject createOrUpdateInDefaultRealmWithValue:] 或其他具有相同语义的方法,那么它将找到具有相同主键的现有对象并使用新值更新其所有属性。列表属性通过主键扫描现有对象,只有包含在提供的NSArray 中的对象仍与更新的RLMObject 关联。

    在您的情况下,您可以从 dictionary 中删除每个项目对象的 floors 属性,这样您仍然可以使用上述方法合并,但您可以自己手动合并楼层,方法是查询每个楼层 id您的项目实例的floors 属性,是否已经存在这样的楼层,如果没有,则回退到再次创建或更新并将其与项目相关联。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多