【问题标题】:Core Data using auto generated Primary Key PK使用自动生成的主键 PK 的核心数据
【发布时间】:2017-03-29 02:06:32
【问题描述】:

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

我希望使用 objectID 检索记录,但出现以下错误:

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'keypath objectID not found in 实体 '

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!)")
        }

    }
}

【问题讨论】:

    标签: swift core-data


    【解决方案1】:

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

    【讨论】:

    • 但是,这需要一个 NSManaged​Object​ID,并且不能与问题中的 let personID: Int = 2 一起使用。
    • 这让您想知道为什么他们为您创建主键但不​​让您访问它。似乎在鼓励我们打破参照完整性规则。
    【解决方案2】:

    objectIDNSManagedObject 的属性,但不是持久存储中的字段名称或实体描述的一部分。您不能在谓词中使用它,因为它不能用作过滤器。 主存储中有一个字段对应于对象 ID,但它也不能用于获取请求,因为这不是 Core Data 的预期用途。

    如果你想要一个 Core Data 的主键,你需要自己创建它。或者如果你真的想要 SQL 风格的编码,直接使用 SQLite,不要涉及 Core Data。

    【讨论】:

    • 有趣,所以最好忽略主键并使用自己的值。
    • 是的。 Core Data 通常通过关系维护参照完整性。这些将由内部私钥支持,但这是一个实现细节。注意在使用 Core Data 时不要过多考虑 SQL,因为它不是一回事。
    猜你喜欢
    • 2023-03-20
    • 2013-10-05
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多