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,为什么不只是创建从关联Foo的Bar,并设置相应的Bar实例作为上相应的关联的目标Foo实例.让Core Data跟踪对象ID.
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是一个临时值,在保存对象时将更改该值.