我试图通过传入一个字符串数组来拉出核心数据存储中的对象,并且仅拉动具有与数组中的类别相匹配的类别的对象。
我已经能够使这个代码工作,除了它只使用数组中的第一个项目,并且不会遍历数组并匹配其余的项目。
这是适用于此的代码。我正在使用接受和数组的NSPredicate重载。
func filterTopicCategories() {
fetchController.topicFetchRequest.predicate = NSPredicate(format: "topicCategory == %@", argumentArray: selectedCategories)
topicsToSelectFrom = fetchController.fetchTopics()
}
我已经将关于谓词的Apple文档倾注了所有这些,而且似乎无法弄明白。我花了几个小时在谷歌周围搜索。我不确定我是不是只是没有正确理解,或者如果我只是完全错了,我不确定。任何帮助将不胜感激。
由于
答案 0 :(得分:6)
参数argumentArray
用于替换格式字符串中%@
等占位符的值数组。
您正在寻找IN
运营商:
IN
等效于SQL
IN
操作,必须出现左侧 在右侧指定的集合中。例如,name IN { 'Ben', 'Melissa', 'Nick' }
。集合可以是数组,a 设置或字典 - 在字典的情况下,使用其值。 在Objective-C中,您可以创建一个IN
谓词,如下所示 以下示例:NSPredicate *inPredicate = [NSPredicate predicateWithFormat: @"attribute IN %@", aCollection];
其中
aCollection
可能是NSArray
,NSSet
的实例,NSDictionary
,或任何相应的可变类。
所以如果topicCategory
是一个字符串写
fetchController.topicFetchRequest.predicate = NSPredicate(format: "topicCategory IN %@", selectedCategories)
答案 1 :(得分:1)
好的,所以我最终偶然发现了这个问题Swift Core Data Predicate IN Clause,提到在重载中删除了argumentArray标签。我试过了,然后也改变了我的谓词格式。所以现在它看起来像这样
func filterTopicCategories() {
fetchController.topicFetchRequest.predicate = NSPredicate(format: "ANY topicCategory IN %@", selectedCategories)
topicsToSelectFrom = fetchController.fetchTopics()
}
现在似乎有用了。不确定这是不是一个bug,因为Xcode中的自动完成将那个标签放在那里,所以,很奇怪。
无论如何,希望这有助于有人在同样的问题上挣扎。
感谢。
答案 2 :(得分:0)
这对我有用:
`
let isWatchLaterPredicate = NSPredicate(format: "isWatchLater == YES")
let managedContext = appDelegate.managedObjectContext
let fetchRequestWatchLater = NSFetchRequest<NSManagedObject>(entityName: "WatchList")
fetchRequestWatchLater.predicate = isWatchLaterPredicate
print(fetchRequestWatchLater)
do {
watchList = try managedContext.fetch(fetchRequestWatchLater)
print("watch List Items \(isWatchLaterPredicate)")
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
}
`