SwiftUI与CoreData问题:含%K的自定义NSPredicate无法生效
使用%K占位符的NSPredicate在CoreData中失效的解决思路
从报错信息"unimplemented SQL generation for predicate : (description CONTAINS[cd] \"T\")"能直接定位问题:你传入%K的filter.key值是description,但这个description是NSObject的默认属性,并非你CoreData实体Offense中定义的持久化属性。CoreData没法为非持久化属性生成SQL查询,所以才会报错。
解决方法:
- 检查
FilterModel里的key字段,确保所有激活的filter对应的key,都是Offense实体中已存在的持久化属性名(比如你测试有效的title)。 - 如果确实需要搜索
description,先确认Offense实体在CoreData模型里有没有定义名为description的属性——没有的话要么添加该属性,要么换成已有的属性名。
修正后的代码示例:
只要保证filter.key指向正确的CoreData属性名,原代码结构可以保留,这里做了一点精简:
init(key: String = "", filters: [FilterModel]){ var filterPredicates: [NSPredicate] = [] if !key.isEmpty { filterPredicates = filters.filter(\.active) .map { filter in // 确认filter.key是Offense实体中存在的持久化属性 NSPredicate(format: "%K CONTAINS[cd] %@", filter.key, key) } if !filterPredicates.isEmpty { _foundResults = FetchRequest<Offense>( sortDescriptors: [NSSortDescriptor(key: "title", ascending: true)], predicate: NSCompoundPredicate(orPredicateWithSubpredicates: filterPredicates) ) } } searchKey = key }
补充说明:
- %K的写法本身没问题,它的作用就是安全插入属性名,失效完全是因为传入的属性名不被CoreData识别为持久化属性。
- 硬编码
title能运行,就是因为title是Offense实体里存在的持久化属性,CoreData可以生成对应的SQL查询语句。
内容的提问来源于stack exchange,提问作者Jeník Radek
相关产品推荐
相关产品推荐

