为什么我的 NSPredicate 可以过滤一个实体属性而不是另一个?
Why can my NSPredicate filter for one entity attribute but not the other?
我想使用 NSPredicate
来显示存储在 Core Data 中且开始日期设置为特定月份的学校科目。我目前将月份名称存储为字符串。问题是当我尝试显示由 "startMonth" 过滤的主题时,调试器打印出 "Number of results: 0"(我在这个例子中尝试使用 August,它应该 return 英语但不是!)。
然而,这是奇怪的部分,如果我按名称过滤 "English" 我得到 1 个结果(即英语。我还在循环中打印出它的 "startMonth" 和 startMonth确实是"August")。有谁知道为什么当我搜索名字时一切正常但几个月都没有?当然,我已经仔细检查过月份是否正确大写,我没有混淆 startMonth 和 endMonth 等......我只是不明白为什么我可以过滤一个属性而不是另一个......
所以,这不起作用,调试器打印出 "Number of results: 0"(应该 return 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
输入值时,它可能还包含额外的 leading or trailing space
。
您可以使用两种方法解决此问题。
- 当您输入值 trim 时,额外的 space.
- 使用
CONTAINS
和 predicate
而不是 =
它将检查字符串是否包含给定的字符串。
我想使用 NSPredicate
来显示存储在 Core Data 中且开始日期设置为特定月份的学校科目。我目前将月份名称存储为字符串。问题是当我尝试显示由 "startMonth" 过滤的主题时,调试器打印出 "Number of results: 0"(我在这个例子中尝试使用 August,它应该 return 英语但不是!)。
然而,这是奇怪的部分,如果我按名称过滤 "English" 我得到 1 个结果(即英语。我还在循环中打印出它的 "startMonth" 和 startMonth确实是"August")。有谁知道为什么当我搜索名字时一切正常但几个月都没有?当然,我已经仔细检查过月份是否正确大写,我没有混淆 startMonth 和 endMonth 等......我只是不明白为什么我可以过滤一个属性而不是另一个......
所以,这不起作用,调试器打印出 "Number of results: 0"(应该 return 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
输入值时,它可能还包含额外的 leading or trailing space
。
您可以使用两种方法解决此问题。
- 当您输入值 trim 时,额外的 space.
- 使用
CONTAINS
和predicate
而不是=
它将检查字符串是否包含给定的字符串。