【问题标题】:Why can my NSPredicate filter for one entity attribute but not the other?为什么我的 NSPredicate 可以过滤一个实体属性而不是另一个?
【发布时间】:2017-04-23 13:35:46
【问题描述】:

我想使用 NSPredicate 来显示存储在 Core Data 中的学校科目,这些科目的开始日期设置为特定月份。我目前将月份名称存储为字符串。问题是,当我尝试显示按“startMonth”过滤的主题时,调试器会打印出“结果数:0”(我在本例中尝试使用 August,它应该返回英文但没有!)。

但是,这是奇怪的部分,如果我按名称“English”过滤,我会得到 1 个结果(即英语。我还在循环中打印出它的“startMonth”,而 startMonth 确实是“August”) .有谁知道为什么当我搜索名字而不是几个月时一切正常?当然,我已经仔细检查了月份是否正确大写,我没有混淆 startMonth 和 endMonth 等......我只是不明白为什么我可以过滤一个属性而不能过滤另一个属性......

所以,这不起作用,调试器打印出“结果数:0”(应该返回 1 个结果):

func getSubjects() {

    let delegate = AppDelegate()
    let monthPredicate = NSPredicate(format: "%K = %@", "startMonth", "August")
    let fetchRequest: NSFetchRequest<Subject> = Subject.fetchRequest()
    fetchRequest.predicate = monthPredicate

    do {
        let searchResults = try delegate.getContext().fetch(fetchRequest)

        print("Num of results: \(searchResults.count)")
        for subject in searchResults as [NSManagedObject] {
            print(subject.value(forKey: "name")!)
            print(subject.value(forKey: "startMonth")!)
            print(subject.value(forKey: "endMonth")!)
        }
    } catch {
        print("Error in request")
    }

}

这是可行的,但是:

func getSubjects() {

    let delegate = AppDelegate()
    //Only this line has changed:
    let monthPredicate = NSPredicate(format: "%K = %@", "name", "English")
    let fetchRequest: NSFetchRequest<Subject> = Subject.fetchRequest()
    fetchRequest.predicate = monthPredicate

    do {
        let searchResults = try delegate.getContext().fetch(fetchRequest)

        print("Num of results: \(searchResults.count)")
        for subject in searchResults as [NSManagedObject] {
            print(subject.value(forKey: "name")!)
            print(subject.value(forKey: "startMonth")!)
            print(subject.value(forKey: "endMonth")!)
        }
    } catch {
        print("Error with request")
    }

}

现在调试器打印:

"Num of results: 1
English
August
December"

提前谢谢你!

【问题讨论】:

  • 尝试一次NSPredicate(format: "%K CONTAINS[c] %@", "startMonth", "August")
  • 哇,它起作用了.. 就这么简单... 但是你知道为什么 "%K = %@" 版本适用于 name 而不适用于 startMonth 吗?是什么让 startMonth 与众不同?

标签: swift xcode core-data swift3 nspredicate


【解决方案1】:

当您输入带有startMonth 的值时,它可能还包含额外的leading or trailing space

您可以使用两种方法解决此问题。

  1. 当您输入值时,修剪多余的空间。
  2. 使用CONTAINSpredicate 而不是=,它将检查字符串是否包含给定的字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2022-01-09
    • 2015-02-11
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多