使用自动生成的主键 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 的属性,它的类型是 NSManagedObjectID
而不是 Int
。一般来说,最好创建和管理您自己的 objectId。我通常使用 UUID 字符串。
【讨论】:
但是,这需要一个 NSManagedObjectID,并且不能与问题中的let personID: Int = 2
一起使用。
这让您想知道为什么他们为您创建主键但不让您访问它。似乎在鼓励我们打破参照完整性规则。【参考方案2】:
objectID
是NSManagedObject
的属性,但不是持久存储中的字段名称或实体描述的一部分。您不能在谓词中使用它,因为它不能用作过滤器。 主存储中有一个字段对应于对象 ID,但它也不能用于获取请求,因为这不是 Core Data 的预期用途。
如果你想要一个 Core Data 的主键,你需要自己创建它。或者如果你真的想要 SQL 风格的编码,直接使用 SQLite,不要涉及 Core Data。
【讨论】:
有趣,所以最好忽略主键并使用自己的值。 是的。 Core Data 通常通过关系维护参照完整性。这些将由内部私钥支持,但这是一个实现细节。注意在使用 Core Data 时不要过多考虑 SQL,因为它不是一回事。以上是关于使用自动生成的主键 PK 的核心数据的主要内容,如果未能解决你的问题,请参考以下文章