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

时间:2011-01-18 03:19:45

标签: iphone xcode core-data nspredicate nsmanagedobject

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

有人有任何建议吗?

谢谢!

3 个答案:

答案 0 :(得分:98)

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

<强> BUT

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

答案 1 :(得分:43)

正如Barry Wark所说,永远记住Core Data不是一个orm。纯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]]];

注意:请记住,如果接收者尚未保存在CoreData Context中,则对象ID是一个临时值,在保存对象时会更改。

答案 2 :(得分:0)

这是使用 url = "https://ss.shipstation.com/" driver = webdriver.Chrome("/Users/Robert Woods/Downloads/chromedriver") driver.get(url) x = HttpResponse driver.find_element_by_name("username").send_keys(username) driver.find_element_by_id("password").send_keys(password) driver.find_element_by_id("btn-login").click() 中的 object id 获取 String 作为 Swift 的方式:

NSManagedObject