CoreData获取父对象CountryCD的子对象NameCD方法及报错修复
问题原因与修复方案
1. 直接崩溃原因
你当前的崩溃是NSPredicate格式符书写错误直接导致的:
报错明确提示无法解析格式字符串
"parent == %&"
你把标准的对象占位符%@误写成了%&,属于语法错误,修正该符号即可解决当前崩溃。另外你给出的CountryCD实体属性中不存在parent字段,如果你只是需要拉取所有CountryCD对象,完全不需要添加这个无效谓词。
2. CountryCD与NameCD的关系配置问题
从你提供的Core Data扩展代码来看,当前关系配置不符合常规业务逻辑:
NameCD侧配置了指向CountryCD的一对一关系CountryCD侧配置了指向NameCD的一对多关系,还自动生成了集合操作方法
正常场景下一个国家只会对应一组官方名称、通用名称,因此CountryCD对NameCD应该是一对一关系,你当前配置的一对多属于不合理设计,建议在Core Data模型编辑器中把CountryCD侧的nameCD关系调整为一对一,删除多余的NSSet批量操作方法。
3. 「abstract entity has no children」警告的影响
该警告和你当前的崩溃没有直接关联,警告触发原因是你把某个实体勾选了「Abstract Entity(抽象实体)」选项,但没有配置任何子实体继承它,属于无效配置:
- 如果你没有实体继承的需求,直接在Core Data模型编辑器中找到对应实体,取消勾选「Abstract Entity」即可消除警告
- 如果你确实需要使用抽象父类,补充配置对应的子实体继承关系即可
修复后参考代码
如果你需要拉取所有CountryCD并预加载关联的NameCD避免后续重复查询,代码可调整为:
func fetchCountries() -> [CountryCD] { do { let fetchRequest = NSFetchRequest<CountryCD>(entityName: "CountryCD") // 预加载关联的nameCD关系 fetchRequest.relationshipKeyPathsForPrefetching = ["nameCD"] fetchRequest.returnsObjectsAsFaults = false let countries = try viewContext.fetch(fetchRequest) return countries } catch { print("CoreDataService - fetchCountries: \(error)") return [] } }
后续要获取CountryCD对应的NameCD,直接访问countryCD.nameCD属性即可。
内容的提问来源于stack exchange,提问作者beginner992
相关产品推荐
相关产品推荐

