我正在寻找一些关于如何使CoreData模型与MongoDB保持同步的提示。我正在利用ObjCMongoDB框架,我可以在核心数据中创建对象,如下所示:
coreDataObj = [BSONDecoder decodeManagedObjectWithClass:[Hostname class]
context:[self managedObjectContext]
data:[bson_host dataValue]];不幸的是,当您重新导入MongoDB时,会创建并存储相同对象的副本。
我不确定我是否错误地使用了ObjCMongoDB框架,或者我是否需要使用SyncServices将数据导入到我的核心数据模型中?
有没有人能给我指点或举个例子?
发布于 2013-07-17 21:37:33
ObjCMongoDB (我是它的作者)对核心数据执行反序列化,但目前不是重复数据删除或同步。它将BSON文档视为简单的有序字典,没有标识属性的含义。特别是,它将_id视为任何其他键。
你可以得到你想要的行为,但是你需要自己去实现它。
最简单的方法是在您的NSManagedObject子类中实现-awakeAfterUsingCoder:或-awakeAfterUsingBSONDecoder: -无论是哪一个。解码器将自动调用这些函数。
self将是新的反序列化对象。运行fetch请求以查找self重复的现有条目。如果找到,请将属性应用于现有对象,从上下文中删除新对象,然后返回现有条目。如果没有找到,只需返回self即可。
您可以使用-dictionaryWithValuesForKeys:和-setValuesForKeysWithDictionary:来完成此任务,我通常使用如下方法获得一个键列表:
+ (NSArray *) persistentKeysForEntity:(NSEntityDescription *) entity {
NSMutableArray *result = [NSMutableArray array];
for (NSPropertyDescription *pdesc in [entity properties]) {
if ([pdesc isTransient]) continue;
[result addObject:pdesc.name];
}
return [result copy];
}补充道:如果你不需要排除瞬态属性,你可以用一行来应用这些值:
[target setValuesForKeysWithDictionary:[self dictionaryWithValuesForKeys:self.entity.attributesByName.allKeys]];https://stackoverflow.com/questions/17700584
复制相似问题