如何通过它的 objectID 获取核心数据实体?
Posted
技术标签:
【中文标题】如何通过它的 objectID 获取核心数据实体?【英文标题】:How can I get core data entity by it's objectID? 【发布时间】:2015-03-16 11:39:47 【问题描述】:我有一个来自 coredata 的对象列表,然后我从其中一个对象中获取 objectId:
let fetchedId = poi.objectID.URIRepresentation()
现在我需要为这个特定的 objectID 获取实体。 我尝试了类似的方法:
let entityDescription = NSEntityDescription.entityForName("Person", inManagedObjectContext: managedObjectContext!);
let request = NSFetchRequest();
request.entity = entityDescription;
let predicate = NSPredicate(format: "objectID = %i", fetchedId);
request.predicate = predicate;
var error: NSError?;
var objects = managedObjectContext?.executeFetchRequest(request,
error: &error)
但我得到错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath objectID not found in entity <NSSQLEntity Person id=4>'
【问题讨论】:
既然可以objectWithID:
,为什么还要创建获取请求?
【参考方案1】:
您不能使用 NSFetchRequest 的谓词查询 NSManagedObject 的任意属性。这仅适用于您的实体中定义的属性。
NSManagedObjectContext 有两种方法来检索具有 NSManagedObjectID 的对象。如果对象在上下文中不存在,第一个会引发异常:
managedObjectContext.objectWithID(objectID)
第二个将返回 nil 失败:
var error: NSError?
if let object = managedObjectContext.existingObjectWithID(objectID, error: &error)
// do something with it
else
println("Can't find object \(error)")
如果你有一个 URI 而不是 NSManagedObjectID,你必须先把它变成一个 NSManagedObjectID。 persistentStoreCoordinator 用于此目的:
let objectID = managedObjectContext.persistentStoreCoordinator!.managedObjectIDForURIRepresentation(uri)
【讨论】:
我认为这是错误的方法,除非它已在 swift 3 中更改 -context.existingObject(with: objectID)
抛出,context.object(with: objectID)
如果找不到则返回 nil【参考方案2】:
您得到的不是对象 ID,而是 URI。对象 ID 是 URI 的一部分。您可以使用
- managedObjectIDForURIRepresentation:
向持久存储协调器询问对象 ID。拥有对象 ID,您可以使用例如 -objectWithID:
从上下文中获取对象。但是出于某些原因,请查看此方法的文档。
【讨论】:
以上是关于如何通过它的 objectID 获取核心数据实体?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用尚未保存在 iOS 中的 objectID 访问 NSManagedObject 实体?