【问题标题】:EXC_BAD_ACCESS when using NSPredicate in Swift在 Swift 中使用 NSPredicate 时的 EXC_BAD_ACCESS
【发布时间】: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


【解决方案1】:

事实证明 NSPredicate 不适用于标记为“可转换”且自定义类为 [String] 的属性。

我没有使用数组,而是将它变成了一个字符串,用“;”分隔每个单独的过敏原。以便以后可以分成子字符串。

过敏原示例:

dinner.allergens = "Gluten;Dairy"

NSPredicate:

let predicate = NSPredicate(format:"NOT (%K CONTAINS[cd] %@)",attribute, text)

获取请求现在将获取所有不具有包含文本的过敏原属性的实体

【讨论】:

    猜你喜欢
    • 2014-12-10
    • 2014-06-29
    • 2015-04-21
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多