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

Posted

技术标签:

【中文标题】使用自动生成的主键 PK 的核心数据【英文标题】:Core Data using auto generated Primary Key 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!)")
        

    

【问题讨论】:

【参考方案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,因为它不是一回事。

以上是关于使用自动生成的主键 PK 的核心数据的主要内容,如果未能解决你的问题,请参考以下文章

19 01 18 dango 模型

Django框架:模型 定义属性

PowerDesigner中表名过长,自动生成的主键名截取的问题

自动生成的主键

将自动递增的主键插入 Access 表

Fluent NHibernate 多对多映射,使用自动生成的 pk 而不是复合键