SwiftData一对多模型:如何构建查询谓词?解决contains报错
SwiftData 查询一组公司对应的所有证书问题解决办法
问题原因
直接在SwiftData的#Predicate中调用内存中Set<Company>的contains方法会触发报错,因为SwiftData的查询谓词无法直接处理这种内存集合的成员检查操作,它要求谓词中的操作必须能被转换为底层的数据查询语句。
解决步骤
给Company模型添加唯一标识属性
为让SwiftData能准确匹配关联关系,给Company添加一个唯一id属性:import SwiftData @Model class Company { @Attribute(.unique) var id: UUID @Relationship(deleteRule: .cascade, inverse: \Certificate.company) var certs: [Certificate]? init(id: UUID = UUID()) { self.id = id } } @Model class Certificate { var company: Company init(company: Company) { self.company = company } }修改查询谓词逻辑
将内存中的公司集合转换为id数组,然后在谓词中通过匹配证书关联公司的id是否在该数组中来筛选:struct MyView: View { @Query var certs: [Certificate] init(appContext: AppContext) { let companies = multiSel // 你的Set<Company>实例 let companyIds = companies.map { $0.id } let predicate = #Predicate<Certificate> { companyIds.contains($0.company.id) } _certs = Query(filter: predicate, animation: .snappy) } }
原理说明
SwiftData的#Predicate支持对模型属性的contains操作,将公司集合转换为id数组后,谓词可以把这个操作转换为数据存储层面的查询,从而正确筛选出指定公司下的所有证书,避免了之前的类型错误。
内容的提问来源于stack exchange,提问作者George Papadopoulos
相关产品推荐
相关产品推荐

