SwiftData查询报错‘to-many key not allowed here’求解决方案
SwiftData多对多关联筛选报错解决:获取包含特定学生的班级
问题根源
你遇到的error: SQLCore dispatchRequest: exception handling request: <NSSQLFetchRequestContext: ...> , to-many key not allowed here错误,是因为在#Predicate中直接对多对多关联的可选数组使用flatMap+contains的Swift集合操作写法,无法被SwiftData(底层基于Core Data)解析为合法的SQL查询语句。Core Data对多对多关系的查询有特定语法要求,不能直接套用普通数组操作逻辑。
解决方案
替换查询谓词为以下两种合法写法之一即可:
写法1:使用ANY关键字(Core Data传统谓词语法)
let descriptor = FetchDescriptor<ClassModel>(predicate: #Predicate { ANY $0.students.name == "Bob" })
写法2:使用SwiftData的contains(_:)谓词方法
let descriptor = FetchDescriptor<ClassModel>(predicate: #Predicate { $0.students.contains { $0.name == "Bob" } })
两种写法都能正确触发多对多关联查询,筛选出包含名为"Bob"的学生的班级。无需额外处理students的可选值,#Predicate会自动处理空数组的情况。
验证修改
将测试代码中的谓词替换后重新运行,就能正确获取到1个符合条件的班级(Math),断言会正常通过。
内容的提问来源于stack exchange,提问作者NanoApe
相关产品推荐
相关产品推荐

