swift - 为什么我的 NSPredicate 可以过滤一个实体属性而不是另一个?

标签 swift xcode core-data swift3 nspredicate

我想使用 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"

提前致谢!

最佳答案

当您使用 startMonth 输入值时,它可能还包含额外的前导或尾随空格

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

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

关于swift - 为什么我的 NSPredicate 可以过滤一个实体属性而不是另一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41037282/

相关文章:

swift - OSX Cocoa NSSearchField 清除按钮不响应点击

ios - 使用 Alamofire 和 Swift 4 上传图片时出现问题

iphone - TTTableViewController 用对象数组变量填充数据源

ios - 具有多个图像和标签的自定义单元格显示不一致

iphone - 为什么 Core Data 使用 Z 前缀命名它在 SQLite 中创建的表和属性?

ios - 图像转换为 NSData 时出现问题

string - 快速字符串追加机制

objective-c - 使用@import ...作为默认值而不是#import <...>

尽管返回 True,IOS ObjectContext 仍未保存到持久存储

swift - Tableview 附件无法正确加载