如何通过它的objectID获取核心数据实体?

时间:2015-03-16 11:39:48

标签: swift core-data

我有一个来自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>'

2 个答案:

答案 0 :(得分:16)

您无法使用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)

答案 1 :(得分:2)

你得到的不是对象ID,而是URI。对象ID是URI的一部分。您可以向持久性存储协调器询问具有 - managedObjectIDForURIRepresentation:的对象ID。拥有对象ID,您可以使用例如-objectWithID:从上下文中获取对象。但出于某些原因,请查看这些方法的文档。