【发布时间】:2021-02-24 20:05:12
【问题描述】:
我正在尝试从 Core Data 中获取我的所有过敏原属性中没有“X”的项目。
func doesNotContain(attribute: String = "allergens", text: String) {
let request: NSFetchRequest<Dinner> = Dinner.fetchRequest()
let predicate = NSPredicate(format:"NOT \(attribute) CONTAINS %@", text)
request.predicate = predicate
do { items = try context.fetch(request) }
catch let error { print("Error: \(error)") }
}
由于某种原因,这会因“EXC_BAD_ACCESS”而崩溃
但当我尝试使用以下方式获取谓词时,它工作得非常好:
func containsSearchWithNSPredicate(attribute: String, text: String) {
let request: NSFetchRequest<Dinner> = Dinner.fetchRequest()
let predicate = NSPredicate(format: "\(attribute) CONTAINS[cd] %@", text)
request.predicate = predicate
do { items = try context.fetch(request) }
catch let error { print("Error: \(error)") }
}
这里的属性在函数调用时设置为“name”,在第一个例子中设置为“allergens”
我已经确定属性“allergens”不为零,并且我也尝试过使用 %d 而不是 %@。 allergens 属性是一个数组,这就是我使用 NOT CONTAINS 的原因
【问题讨论】:
-
@matt 不,但是 NSPredicate 应该与 NOT CONTAINS 以及 CONTAINS 一起使用,不是吗?第一个例子是 NOT CONTAINS
-
它是否可以使用额外的括号,如stackoverflow.com/a/12535373/1187415 ?
-
如果
allergens属性是一个数组,那么谓词无论如何都不起作用(作为提取的一部分)。 -
NSPredicate(format: "\(attribute) CONTAINS[cd] %@", text)应该是NSPredicate(format: "%K CONTAINS[cd] %@", attribute, text),这样更好。 -
如果
attribute是一个数组,不应该是"ANY attributes CONTAINS %@"而不是工作吗?它不是 CoreData,但这就是为什么你的行为很奇怪:pastebin.com/p1iFFb0q 你应该使用ANY,除非你在attribute上放了一些奇怪的值。
标签: swift core-data nspredicate nsfetchrequest