CoreData:错误 - 实体没有键值编码兼容的ID。

4

我遇到了核心数据错误,当我尝试保存Group <<->> Contact之间的关系时。

我通过hashUser从coredata中获取一个Contact,通过uid获取一个Group,并尝试使用func添加to-many关系。

// 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" 键在哪里? 请帮忙。
2个回答

5
这个问题与某些观察上下文保存的地方有关,就像错误提示所示。如果您正在使用NSFetchedResultsController或其他监视该事件的东西,则在那里会出现问题。也许是UITableViewCell中的拼写错误?

1
我有一个实体树,其中包含父子关系。我认为这个答案解决了我一直遇到的问题。我有NSFetchedResultsControllers监听其中一个子实体的属性。我的解决方法是将被搜索的属性移动到实体关系树的根实体中。我认为这个崩溃发生是因为NSManagedObjectContext.mergeChanges(...)可能有一个NSFetchedResultsController监听保存上下文。这似乎是一个核心数据错误,但XCode在崩溃信息中没有给我足够的信息,所以这纯粹是猜测。 - CoderDake
TopGunCoder:如果您有一个实体树,所有实体都继承自一个抽象的父实体,那么您很可能会遇到性能问题,因为Core Data将所有这些实体放入SQLite中的单个表中。 - Marcus S. Zarra

1
在您的控制器中查找尝试设置或获取id而不是uid的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接