在 Swift Data 中我有一个基本模型
@Model class MovieSD {
@Attribute(.unique) var title: String
var genre: [String] = [String]()
init(title: String) {
self.title = title
}
}
我试图在获取数据时创建谓词。创建按标题搜索的谓词按预期工作
let movieTitle = #Predicate<MovieSD> { movie in
movie.title.contains("filterstring")
}
但是当尝试对字符串数组执行相同操作时
let movieGenre = #Predicate<MovieSD> { movie in
movie.genre.contains("filterstring")
}
导致 EXC_BAD_ACCESS 崩溃
类似的方法会产生不同的错误并指出可能的问题。
let movieGenre2 = #Predicate<MovieSD> { movie in
if movie.genre.contains(where: { $0 == "filterstring" }) {
return true
} else {
return false
}
}
导致崩溃并出现错误:
error: SQLCore dispatchRequest: exception handling request: <NSSQLFetchRequestContext: 0x281a96840> , Can't have a non-relationship collection element in a subquerySUBQUERY(genre, $$_local_1, $$_local_1 == "SciFi") with userInfo of (null)
或者大致相同的错误:
let movieGenre3 = #Predicate<MovieSD> { movie in
movie.genre.filter { genre in
return genre == "filterstring"
}.count > 0
}
看来 Swift Predicate 应该能够使用 NSPredicate 来创建依赖于 SUBQUERY 的条件语句。但在这种情况下,它似乎不太有效。
当然,我可以使用类似于上面的方法来过滤返回的数组。但这似乎效率很低。而且看起来应该可以过滤。另外,我想避免将流派数组放入 @model Genre 类的方法。
任何显示如何使用 Swift Data 的谓词过滤字符串数组的帮助将不胜感激。
如果它适合您的应用程序,您可以将流派存储在不同的表中并对其进行查询。
@Model class Genre {
@Attribute(.unique) var name: String
init(name: String) {
self.name = name
}
}
@Model class MovieSD {
@Attribute(.unique) var title: String
var genre = [Genre]()
init(title: String) {
self.title = title
}
}
这篇文章可以帮助解释为什么会发生这种情况。
如果您使用值类型的集合,例如[String],SwiftData 也会将其直接保存在单个属性中。现在它被编码为二进制属性列表数据,这意味着您不能在谓词中使用数组的内容。