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的主要内容,如果未能解决你的问题,请参考以下文章

这个类不是键值编码兼容的错误吗? Xcode 11

iOS:通过键值编码设置 coredata 属性?

此类不是键的键值编码兼容的键

为啥会出现错误:类与键名的键值编码不兼容?

此类与键错误的键值编码不兼容

NSDictionary setValue:forKey: -- 得到“这个类不是键值编码兼容的键”