9

有没有办法更新核心数据中的现有记录,而不是总是创建新记录?这篇博updateWithJSON:文看起来很有希望,但我在 Mantle 的某个地方找不到这种方法。现在,我正在执行以下操作:

MantleObject *mantleObject = [MTLJSONAdapter modelOfClass:[MantleObject class] fromJSONDictionary:dictionary error:NULL];
CoreDataObject *coreDataObject = [CoreDataObject MR_findFirstByAttribute:@"primaryKey" withValue:mantleObject.primaryKey];

// avoid duplicates
if (coreDataObject != nil) {
    [coreDataObject MR_deleteEntity];
}

[MTLManagedObjectAdapter managedObjectFromModel:mantleObject insertingIntoContext:[NSManagedObjectContext MR_contextForCurrentThread] error:NULL];

它按预期工作,但我不喜欢总是一遍又一遍地删除和创建“相同”对象的想法。所以我很想有机会更新现有对象(覆盖很好;新对象的所有值都可以替换现有对象)。

4

2 回答 2

10

Mantle 从 1.3 版开始支持更新托管对象。

您的模型类需要实现MTLManagedObjectSerializing协议方法propertyKeysForManagedObjectUniquing并返回标识模型的属性键,在您的情况下显示为primaryKey

+ (NSSet *)propertyKeysForManagedObjectUniquing {
    return [NSSet setWithObject:@"primaryKey"];
}

标题文档解释了它是如何工作的,但基本上MTLManagedObjectAdapter如果存在一个现有的托管对象,它将获取一个现有的托管对象并更新该对象而不是创建一个新对象。

我建议使用 Mantle 的内置支持,而不是尝试自己查找重复项。这将导致更简单、更可维护的代码。

于 2014-03-21T15:16:58.380 回答
1

我对“地幔”或“MagicalRecord”一无所知,但是......

这看起来确实非常昂贵。
看起来好像您已经获取了现有项目(为了删除它),缺少的步骤是从您的所有属性中获取MantleObject并更新现有项目。

就 CoreData 而言,您可以:

  1. 像现在一样执行插入(保留对新对象的引用newObj
  2. 保留您要导入的所有托管对象属性键/名称的数组props = @[@"prop1",@"prop2", ...]
  3. 通过使用获取值dict = [newObj committedValuesForKeys:props]
  4. 更新现有对象[existing setValuesForKeysWithDictionary:dict]
  5. 删除newObj [context deleteObject:newObj]

如果没有现有对象,就不要删除新对象

于 2014-03-20T05:39:45.580 回答