You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:13:17