Swift中Core Data保存数据触发NSUnknownKeyException崩溃原因排查
看到你遇到的这个崩溃报错,我太熟悉了——Core Data的KVC相关错误经常藏着一些容易忽略的小细节。虽然你说已经确认键名无误且用了生成的类,但结合报错里的"(null)"键,咱们可以从这几个方向排查:
关联关系的模型配置有隐藏问题
打开你的Core Data模型文件,仔细检查User实体的所有关联关系:有没有不小心把关联的Name字段留空了?或者拼写的时候有大小写错误(比如模型里是posts,但生成的类里写成Posts)?Swift是大小写敏感的,哪怕一个字母大小写不对,都会触发这个错误。另外还要确认关联的逆关系是否正确配置,Core Data对逆关系的依赖很强,缺失或配置错误也可能导致奇怪的KVC异常。生成的NSManagedObject子类和模型不同步
很多时候我们修改了模型里的关联关系,但忘了重新生成子类文件。比如你给User加了一个关联到Post的关系,但是旧的User类里根本没有这个属性,或者属性名和新模型不一致。解决方法很简单:选中模型里的User实体,点击菜单栏的Editor > Create NSManagedObject Subclass...,覆盖原来的类文件,确保代码完全同步最新的模型配置。代码中不小心传入了nil作为键名
报错里明确提到了"(null)"键,这大概率是某个地方调用KVC的setValue(_:forKey:)时,key参数是nil。比如你可能在循环处理字典数据时,某个键名变量被意外赋值为nil,或者从字典里取key的时候得到了nil,然后传给了setValue。检查所有设置User属性的代码,特别是用KVC的地方,确保key参数绝对不是nil。如果是用点语法设置关联关系,也要确认属性名拼写正确,比如user.posts = myPostsArray而不是写错成user.post = ...。类混淆或继承错误
有没有可能项目里存在多个同名的User类?比如你自己写了一个自定义的User类,和Core Data生成的类重名了,导致运行时系统加载了错误的类,这个类里没有对应的关联属性。另外还要确认Core Data生成的User类确实正确继承了NSManagedObject,没有被误改。
最后,别忘了清理一下项目的构建缓存(Product > Clean Build Folder),然后重新构建运行——有时候旧的缓存文件会导致模型和代码不匹配的问题。
内容的提问来源于stack exchange,提问作者Michał Ziobro

