使用自动生成的主键PK的核心数据

时间:2017-03-29 02:06:33

标签: swift core-data

我在Core Data中有一个简单的Person实体,我注意到在添加数据时,每行都会自动生成一个名为 objectID 的唯一 PK

我希望使用objectID检索记录,但是我收到以下错误:

  

由于未捕获的异常而终止应用   ' NSInvalidArgumentException',原因:'未找到keypath objectID   实体< NSSQLEntity Person id = 2>'

func fetchPerson(withID personID: Int,
                 context: NSManagedObjectContext,
                 completion: @escaping ([Person]?) -> Void) {

    let fetchRequest: NSFetchRequest<Person> = Person.fetchRequest()

    let predicate = NSPredicate(format: "\(#keyPath(Person.objectID)) == \(personID)")
    fetchRequest.predicate = predicate

    //perform aynchronous operation:
    context.perform {
        do {
            let persons = try fetchRequest.execute()
            //success - return array of persons
            completion(persons)
        } catch {
            //error - return nil
            completion(nil)
        }

    }

}

调用上述内容:

//fetch person with specific id:
let personID: Int = 2
fetchPerson(withID: personID, context: persistentContainer.viewContext) { (persons: [Person]?) in
    if persons != nil {

        print("Fetching person with personID: \(personID)")
        for person in persons! {
            print("Person: \(person.objectID) - \(person.firstName!) \(person.lastName!)")
        }

    }
}

2 个答案:

答案 0 :(得分:1)

您可以使用谓词"self == %@", objectID使用objectID进行提取。 objectID是managedObject的属性,其类型为NSManaged​Object​ID而不是Int。通常,最好创建和管理自己的objectId。我通常使用UUID字符串。

答案 1 :(得分:0)

objectIDNSManagedObject的属性,但不是持久性存储中的字段名称或实体描述的一部分。您不能在谓词中使用它,因为它不能用作过滤器。 主存储中与对象ID对应的字段,但它也不可用于获取请求,因为这不是核心数据的使用方式。

如果您想要一个包含Core Data的主键,您需要自己创建它。或者,如果您真的想要SQL风格的编码,请直接使用SQLite,并且不要使用Core Data。