地幔和核心数据 - 更新而不是删除/创建

时间:2014-03-19 23:51:38

标签: core-data ios7 github-mantle

在地幔中是否有办法更新核心数据中的现有记录而不是始终创建新记录? This blog post看起来很有希望,但我在曼特尔的某个地方找不到方法updateWithJSON:。现在,我正在做以下事情:

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];

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

2 个答案:

答案 0 :(得分:10)

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

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

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

header doc解释了它的工作原理,但基本上MTLManagedObjectAdapter将获取现有的托管对象(如果存在)并更新该对象而不是创建新对象。

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

答案 1 :(得分:1)

我对#34; mantle"一无所知或" MagicalRecord"但是......

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

就CoreData而言,你可以:

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