我在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!)")
}
}
}
答案 0 :(得分:1)
您可以使用谓词"self == %@", objectID
使用objectID进行提取。 objectID是managedObject的属性,其类型为NSManagedObjectID
而不是Int
。通常,最好创建和管理自己的objectId。我通常使用UUID字符串。
答案 1 :(得分:0)
objectID
是NSManagedObject
的属性,但不是持久性存储中的字段名称或实体描述的一部分。您不能在谓词中使用它,因为它不能用作过滤器。 是主存储中与对象ID对应的字段,但它也不可用于获取请求,因为这不是核心数据的使用方式。
如果您想要一个包含Core Data的主键,您需要自己创建它。或者,如果您真的想要SQL风格的编码,请直接使用SQLite,并且不要使用Core Data。