如何通过它的 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 实体?

在 Core Data 中获取多个 objectID?

嵌套核心数据获取

如何从核心数据中获取父实体的所有子实体,以及如何将父数据用作 UITableview

核心数据:如何根据相关实体的属性获取实体