核心数据 - 数据库中行的主键ID

Woo*_*tty 42 iphone xcode core-data nspredicate nsmanagedobject

假设我有一个存储在Core Data中的书籍列表.我想通过它的主键ID搜索一本书.我知道Core Data创建的sqlite文件在每个表中都有一个ID列,但无论如何这似乎都没有暴露给我.

有没有人有任何建议?

谢谢!

Bar*_*ark 101

-[NSManagedObject objectID]是Core Data中对象实例的唯一ID.它可以通过序列化-[NSManagedObjectID URIRepresentation].您可以objectID从持久性存储协调器中检索-[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:],然后从托管对象上下文中获取对象-[NSManagedObjectContext objectWithID:].

您应该记住,核心数据不是 ORM.它是一个对象图管理框架.这是使用SQLite(和唯一的行ID)作为后端纯粹是一个实现细节.您越早摆脱SQL/RDBMS思维模式,您对Core Data的满意度就越快.不要试图从存储的ID中查找对象,而应考虑为什么需要该对象以及需要它的对象.如果类的实例Foo需要能够去类的一个实例Bar,为什么不只是创建从关联FooBar,并设置相应的Bar实例作为上相应的关联的目标Foo实例.让Core Data跟踪对象ID.

  • 我希望我能再给你一个"核心数据不是数据库"的加号. (34认同)
  • 有一些常见的用例,您需要通过其id来获取对象 - 将数据从表视图单元格选择传递到详细视图控制器.您可以只传递对象本身,但如果您在详细信息VC中使用不同的上下文,通常不希望这样做. (7认同)
  • @Noah传递objectIDs是2个最佳实践之一[根据Apple](https://developer.apple.com/library/mac/documentation/cocoa/conceptual/coredata/articles/cdConcurrency.html). (2认同)

Don*_*nit 45

正如Barry Wark所说,永远记住Core Data不是一个orm.纯SQL详细信息不会向用户公开,每行只是一个对象.顺便说一句,有时您需要访问"主键",例如当您需要将coredata db与外部sql数据库同步时(在我的情况下,我需要它在回调函数中以在INSERT之后更改对象的状态它在远程数据库中取得了成功).在这种情况下,您可以使用:

objectId=[[[myCoredataObject objectID] URIRepresentation] absoluteString]
Run Code Online (Sandbox Code Playgroud)

将返回如下字符串:x-coredata:// 76BA122F-0BF5-4D9D-AE3F-BD321271B004/Object/p521,它是coredata用于标识该对象的唯一ID.

如果要返回具有该唯一ID的对象:

NSManagedObject *managedObject= [managedObjectContext objectWithID:[persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:objectId]]];
Run Code Online (Sandbox Code Playgroud)

注意:请记住,如果接收方尚未保存在CoreData上下文中,则对象ID是一个临时值,在保存对象时将更改该值.