2010-10-17 85 views
3

我想将iPhone上的Core Data与Sinatra服务器上的MongoDB同步。如何手动设置NSManagedObjectID?

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

你有什么建议?我是否也应该在iPhone上使用MongoDB?我只是意识到它有一个Objective-C驱动程序。但是我刚刚开始熟悉Core Data,它有很酷的东西(比如撤消支持),我可能会使用它......现在,我只是用它来简单地获取持久存储,所以我可以取代它。但是我打算在未来实现撤销支持,因为我认为这是很好的可用性。我更喜欢撤消选项而不必回答确认弹出窗口,例如,我喜欢GMail如何让您撤销发送或撤消消息删除等。

谢谢!

马特

回答

3

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

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

+0

这是一篇很棒的文章。我有一个类似的问题需要解决,并且我坚持使用Core Data和'remoteID' Int32属性。性能绝对是一个问题,瓶颈是为每个在remoteID上键入的项目执行一次获取,以查看它是否已经在MOC中。大约100次左右,iPhone 3GS需要1秒钟左右的时间,而第一代iPhone则需要5秒钟左右。可能的改进是使用'IN'谓词一次获取多个项目,并在后台线程中执行。 – 2010-10-17 04:09:00

+0

谢谢,是的,我想我会坚持使用Core Data并按照你的建议做,特别是,因为我正在使用'NSFetchedResultsController',我忘了在我的问题中提到。 – ma11hew28 2010-10-17 16:08:30