1

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

coreDataObj = [BSONDecoder decodeManagedObjectWithClass:[Hostname class]
                                                context:[self managedObjectContext]
                                                   data:[bson_host dataValue]];

不幸的是,当您重新导入 MongoDB 时,会制作并存储相同对象的副本。

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

有人可以指导我或提供一个例子吗?

4

1 回答 1

0

ObjCMongoDB(我是其中的作者)对 Core Data 执行反序列化,但目前还没有重复数据删除或同步。它将 BSON 文档视为简单的有序字典,没有识别属性的意义。特别是,它_id像任何其他键一样对待。

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

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

self将是新的反序列化对象。self运行获取请求以查找重复的现有条目。如果找到,请将属性应用于现有对象,从上下文中删除新对象,然后返回现有条目。如果您没有找到,只需返回self

您可以使用-dictionaryWithValuesForKeys:and-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]];
于 2013-07-17T13:37:32.930 回答