Objective c OSX中的ObjCMongoDB框架和SyncServices

Objective c OSX中的ObjCMongoDB框架和SyncServices,objective-c,mongodb,core-data,objcmongodb,Objective C,Mongodb,Core Data,Objcmongodb,我正在寻找一些关于如何保持CoreData模型与MongoDB同步的指针。我正在利用ObjCMongoDB框架,我可以在核心数据中创建如下对象: coreDataObj = [BSONDecoder decodeManagedObjectWithClass:[Hostname class] context:[self managedObjectContext]

我正在寻找一些关于如何保持CoreData模型与MongoDB同步的指针。我正在利用ObjCMongoDB框架,我可以在核心数据中创建如下对象:

coreDataObj = [BSONDecoder decodeManagedObjectWithClass:[Hostname class]
                                                context:[self managedObjectContext]
                                                   data:[bson_host dataValue]];
不幸的是,当您重新导入MongoDB时,会生成并存储相同对象的副本

我不确定我是否错误地使用了ObjCMongoDB框架,或者我是否需要使用SyncServices将数据导入coredata模型

有人能给我指导或提供一个例子吗?

ObjCMongoDB(我是其作者)对核心数据执行反序列化,但目前不执行重复数据消除或同步。它将BSON文档视为简单的有序字典,没有标识属性的意义。特别是,它将
\u id
视为任何其他键

你可以得到你想要的行为,但你需要自己实现它

最简单的方法是在NSManagedObject子类中实现
-awakAfterUsingCoder:
-awakAfterUsingBSondeCoder:
——不管是哪一个。解码器将自动调用这些

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