CoreData:错误 - 实体不是键值编码兼容的 ID
Posted
技术标签:
【中文标题】CoreData:错误 - 实体不是键值编码兼容的 ID【英文标题】:CoreData: Error - entity is not key value coding-compliant ID 【发布时间】:2016-04-23 18:20:47 【问题描述】:我有核心数据错误,当我尝试保存组>联系人
之间的关系时我通过 hashUser 从 coredata 中获取一个联系人,并通过 uid 获取一个 Group 并尝试添加关系 to-many 与 func
// extension CXDMContact
func addGroup(value: CXDMGroup)
let items = self.mutableSetValueForKey("groups");
items.addObject(value)
当我尝试保存它时,我得到了例外
CoreData: error: Serious application error. Exception was caught during Core Data change processing. This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification. [<CXDMGroup 0x7fb7924aa770> valueForUndefinedKey:]: the entity Group is not key value coding-compliant for the key "id". with userInfo
NSTargetObjectUserInfoKey = "<CXDMGroup: 0x7fb7924aa770> (entity: Group; id: 0xd0000000000c0000 <x-coredata://E66299CB-12A5-4152-8B49-8E9B3B68762F/Group/p3> ; data: \n contacts = (\n \"0xd000000000040002 <x-coredata://E66299CB-12A5-4152-8B49-8E9B3B68762F/Contact/p1>\"\n );\n uid = 5;\n)";
NSUnknownUserInfoKey = id;
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<CXDMGroup 0x7fb7924aa770> valueForUndefinedKey:]: the entity Group is not key value coding-compliant for the key "id".'
但我没有任何 ID 字段,如果我现在查看 managedObjectContext - 我看到了
(lldb) po managedObjectContext.updatedObjects
▿ 2 elements
- [0] : <CXDMContact: 0x7fb7927f5270> (entity: Contact; id: 0xd000000000040002 <x-coredata://E66299CB-12A5-4152-8B49-8E9B3B68762F/Contact/p1> ; data:
chatStatus = nil;
companyId = nil;
companyName = OWN;
companySubscription = nil;
connectedLoads = nil;
countryCode2 = nil;
departmentName = nil;
email = nil;
firstname = Ownname;
groups = (
"0xd0000000000c0000 <x-coredata://E66299CB-12A5-4152-8B49-8E9B3B68762F/Group/p3>"
);
jobTitle = nil;
lastname = Lastname;
messages = "<relationship fault: 0x7fb7924a25b0 'messages'>";
phone1 = nil;
phone2 = nil;
serialNumber = nil;
status = Offline;
timeZoneName = nil;
userHash = 1002;
)
- [1] : <CXDMGroup: 0x7fb7924aa770> (entity: Group; id: 0xd0000000000c0000 <x-coredata://E66299CB-12A5-4152-8B49-8E9B3B68762F/Group/p3> ; data:
contacts = (
"0xd000000000040002 <x-coredata://E66299CB-12A5-4152-8B49-8E9B3B68762F/Contact/p1>"
);
uid = 5;
)
(lldb) po managedObjectContext.insertedObjects
0 elements
(lldb) po managedObjectContext.deletedObjects
0 elements
我不明白密钥“id”在哪里? 请帮忙
【问题讨论】:
【参考方案1】:正如错误提示的那样,这个问题与观察上下文保存有关。如果您使用的是NSFetchedResultsController
或其他监视该事件的东西,那么那里就是您遇到了问题。也许UITableViewCell
中的某个地方有错字?
【讨论】:
我有一棵具有父子关系的实体树。我认为这个答案解决了我一直遇到的问题。我有 NSFetchedResultsControllers 监听子实体的属性之一。我的解决方法是将正在搜索的属性移动到实体关系树的根实体。我认为发生这种崩溃是因为 NSManagedObjectContext.mergeChanges(...) 可能有一个 NSFetchedResultsController 监听保存上下文。这似乎是一个核心数据错误,但 XCode 没有在崩溃信息中给我足够的信息,所以这纯粹是猜测 TopGunCoder:如果您有一棵全部继承自一个抽象父实体的实体树,那么您很可能会遇到性能问题,因为 Core Data 将所有这些实体放入 SQLite 中的单个表中。 【参考方案2】:查找尝试在控制器中的某处设置或获取 id
而不是 uid
的情况。
【讨论】:
以上是关于CoreData:错误 - 实体不是键值编码兼容的 ID的主要内容,如果未能解决你的问题,请参考以下文章