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

假设我有一个存储在核心数据中的书籍列表。 我想通过它的主键ID来search一本书。 我知道由Core Data创build的sqlite文件在每个表中都有一个ID列,但是这似乎并没有暴露给我。

有没有人有任何build议?

谢谢!

-[NSManagedObject objectID]是Core Data中对象实例的唯一标识。 它可以通过-[NSManagedObjectID URIRepresentation]进行序列化。 你可以使用-[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:]从持久存储协调器中检索objectID ,然后用-[NSManagedObjectContext objectWithID:]从托pipe对象上下文获取对象。

你应该记住,核心数据不是一个ORM。 这是一个对象图pipe理框架 。 这是使用SQLite(和唯一的行ID)作为后端纯粹是一个实现的细节。 越早可以摆脱SQL / RDBMS的思维模式,对Core Data越快乐。 不要试图从存储的ID中查找对象,而应考虑为什么需要该对象以及需要哪个对象。 如果Foo类的实例需要能够到达Bar类的实例,那么为什么不从Foo创build一个关联到Bar ,并将相应的Bar实例设置为适当的Foo实例上关联的目标。 让核心数据跟踪对象ID。

正如Barry Wark所说的,记住Core Data不是一个orm。 纯SQL细节不会暴露给用户,每一行都只是一个对象。 顺便说一句,有时你需要访问“主键”,例如,当你需要同步coredata数据库与外部的SQL数据库(在我的情况下,我需要它在callback函数来改变对象的状态后INSERT它在远程数据库中成功)。 在这种情况下,您可以使用:

 objectId=[[[myCoredataObject objectID] URIRepresentation] absoluteString] 

这将返回一个string,如:x-coredata:// 76BA122F-0BF5-4D9D-AE3F-BD321271B004 / Object / p521是coredata用来标识该对象的唯一ID。

如果你想找回那个唯一ID的对象:

 NSManagedObject *managedObject= [managedObjectContext objectWithID:[persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:objectId]]]; 

NB:记住,如果接收器还没有保存在CoreData上下文中,对象ID是一个临时值,当对象被保存时它将会改变。