使用数组Swift进行核心数据过滤谓词

时间:2017-04-16 09:06:54

标签: ios arrays swift core-data nspredicate

我试图通过传入一个字符串数组来拉出核心数据存储中的对象,并且仅拉动具有与数组中的类别相匹配的类别的对象。

我已经能够使这个代码工作,除了它只使用数组中的第一个项目,并且不会遍历数组并匹配其余的项目。

这是适用于此的代码。我正在使用接受和数组的NSPredicate重载。

    func filterTopicCategories() {
        fetchController.topicFetchRequest.predicate = NSPredicate(format: "topicCategory == %@", argumentArray: selectedCategories)
        topicsToSelectFrom = fetchController.fetchTopics()
        }

我已经将关于谓词的Apple文档倾注了所有这些,而且似乎无法弄明白。我花了几个小时在谷歌周围搜索。我不确定我是不是只是没有正确理解,或者如果我只是完全错了,我不确定。任何帮助将不胜感激。

由于

3 个答案:

答案 0 :(得分:6)

参数argumentArray用于替换格式字符串中%@等占位符的值数组。

您正在寻找IN运营商:

  

IN

     

等效于SQL IN操作,必须出现左侧   在右侧指定的集合中。例如,name IN { 'Ben', 'Melissa', 'Nick' }。集合可以是数组,a   设置或字典 - 在字典的情况下,使用其值。   在Objective-C中,您可以创建一个IN谓词,如下所示   以下示例:

NSPredicate *inPredicate = [NSPredicate predicateWithFormat: @"attribute IN %@", aCollection]; 
     

其中aCollection可能是NSArrayNSSet的实例,   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)")
    }

        }

`