【问题标题】:ObjCMongoDB framework and SyncServices in OSXOSX 中的 ObjCMongoDB 框架和 SyncServices
【发布时间】:2013-07-16 01:16:26
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: objective-c mongodb core-data objcmongodb


    【解决方案1】:

    ObjCMongoDB(我是其中的作者)对 Core Data 执行反序列化,但目前还没有重复数据删除或同步。它将 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]];
    

    【讨论】:

      猜你喜欢
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 2013-11-07
      • 2011-06-20
      相关资源
      最近更新 更多