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

假设我有一个存储在核心数据中的书籍清单。 我想通过它的主键ID搜索一本书。 我知道由Core Data创建的sqlite文件在每个表中都有一个ID列,但是无论如何这似乎并不向我公开。

有人有什么建议吗?

谢谢!

2个解决方案
101 votes

Foo是Core Data中对象实例的唯一ID。 可以通过Bar对其进行序列化。您可以使用Bar从持久性存储协调器中检索Foo,然后使用Bar从托管对象上下文中获取对象。

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

Barry Wark answered 2020-08-10T02:12:10Z
45 votes

正如巴里·沃克(Barry Wark)所说,请始终记住核心数据不是规范。 纯SQL详细信息不会向用户公开,每一行都只是一个对象。 顺便说一句,有时您需要访问“主键”,例如,当您需要将coredata db与外部sql数据库同步时(在我的情况下,我需要在回调函数中使用它来在INSERT之后更改对象的状态) 它在远程数据库中获得成功)。 在这种情况下,您可以使用:

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

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

如果要获取具有该唯一ID的对象,请执行以下操作:

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

注意:请记住,如果尚未将接收者保存在核心数据上下文中,则对象ID是一个临时值,在保存对象时会更改。

Donnit answered 2020-08-10T02:12:44Z
translate from https://stackoverflow.com:/questions/4720182/core-data-the-primary-key-id-of-a-row-in-the-database