假设我有一个存储在Core Data中的书籍列表。我想通过它的主键ID搜索一本书。我知道Core Data创建的sqlite文件在每个表中都有一个ID列,但这似乎不会暴露给我。
有人有任何建议吗?
谢谢!
答案 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
的实例,为什么不只是创建从Foo
到Bar
的关联并设置适当的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