在地幔中是否有办法更新核心数据中的现有记录而不是始终创建新记录? 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];
它按预期工作,但我不喜欢总是删除和创建相同的'一遍又一遍地反对。所以我很乐意有机会更新现有的对象(覆盖很好;新对象的所有值都可以替换现有对象)。
答案 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而言,你可以:
newObj
)props = @[@"prop1",@"prop2", ...]
dict = [newObj committedValuesForKeys:props]
[existing setValuesForKeysWithDictionary:dict]
newObj
[context deleteObject:newObj]
如果没有现有对象,则不要删除新对象