如何手动设置 NSManagedObjectID?

Posted

技术标签:

【中文标题】如何手动设置 NSManagedObjectID?【英文标题】:How to set NSManagedObjectID manually? 【发布时间】:2010-10-17 02:46:01 【问题描述】:

我想将 iPhone 上的核心数据与 Sinatra 服务器上的 MongoDB 同步。

当 iPhone 从 Node.js 聊天服务器获取消息时,该消息包含发送者的 BSON ObjectId(一个字符串)。为了让 iPhone 存储这条消息,我在 Core Data 中找到了具有相同 ID 的用户。我希望能够做类似objectWithID 的事情。换句话说,我想将 NSManagedObjectIDs 设置为与 MongoDB BSON ObjectIds 相同。我要检查的另一件事是,如果 managedObjectContext 中没有具有发件人 id 的用户,我将从persistentStore 中获取他,如果他不存在,我将创建他。这只是为了维护 Message 和 Sender 之间的关系。也许我应该将 Message 对象的 sender 属性存储为他的 BSON ObjectId 作为字符串而不是 User NSManagedObject。

你有什么推荐的?我也应该在 iPhone 上使用 MongoDB 吗?我刚刚意识到它有一个 Objective-C 驱动程序。但是我刚刚开始掌握 Core Data 的窍门,它有一些很酷的东西(比如撤消支持),我可能想要使用......现在,我只是将它用于简单的获取和持久存储,所以我可以代替它。但我计划在未来实现撤消支持,只是因为我认为这是很好的可用性。我更喜欢撤消选项而不是必须回答确认弹出窗口,例如,我喜欢 GMail 如何让您撤消发送或撤消删除消息等。

谢谢!

马特

【问题讨论】:

【参考方案1】:

您不能手动设置核心数据对象的 objectID。您可能需要添加一个名为 externalID 的属性或存储从服务器获得的 ID 的东西。

请参阅this article 了解是否使用 Core Data 的一些想法。请注意,作者的建议是在几乎所有情况下都坚持使用 Core Data。

【讨论】:

那是一篇很棒的文章。我有一个类似的问题要解决,我坚持使用带有 remoteID Int32 属性的 Core Data。性能绝对是一个问题,瓶颈是对 remoteID 上键入的每个项目进行提取以查看它是否已经在 MOC 中。在 iPhone 3GS 上,大约 100 次这样的获取大约需要 1 秒,但在第一代 iPhone 上需要 5 秒。可能的改进是使用IN 谓词一次获取多个项目,并在后台线程中进行。 谢谢,是的,我想我会坚持使用 Core Data 并按照您的建议做,尤其是。因为我使用的是NSFetchedResultsController,我忘记在我的问题中提及。

以上是关于如何手动设置 NSManagedObjectID?的主要内容,如果未能解决你的问题,请参考以下文章

从一个上下文到另一个上下文使用 NSManagedObjectID 是不是安全?

在多个 NSPersistentStoreCoordinator-s 之间传递 NSManagedObjectID-s 是不是安全?

NSManagedObjectID 与自定义 UUID 标识符属性 - 获取性能

objectID 多对多关系

-objectRegisteredForID:和--existingObjectWithID之间有什么区别:错误:?

在 UILocalNotification 中设置 UserInfo 时出错