【问题标题】:Searching with NSFetchResult Controller使用 NSFetchResult 控制器搜索
【发布时间】:2017-04-15 23:19:32
【问题描述】:

我一直在研究如何使用 NSFetchResultController 进行搜索,但我遇到的大多数帖子都是 2 年前的。好的,我正在尝试过滤对象,在我的情况下是口袋妖怪。这是我正在使用的函数。

func attemptPokemonFetch(generation: String = "1", name: String = "") {
    let context = coreData.persistentContainer.viewContext

    let request: NSFetchRequest<Pokemon> = Pokemon.fetchRequest()
    let sortByName = NSSortDescriptor(key: "id", ascending: true)
    request.sortDescriptors = [sortByName]
    request.predicate = NSPredicate(format: "generation = %@", generation)
    if !name.isEmpty {
        request.predicate = NSPredicate(format: "name CONTAINS[cd] %@", name)
    }

     let controller = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
    controller.delegate = self
    self.controller = controller

    do {
        try controller.performFetch()
    }
    catch let err {
        print(err)
    }
}

我在视图加载时调用此函数,搜索栏确实更改了文本以及段更改索引值时。我知道如何过滤口袋妖怪并使用搜索。但是我遇到的问题是当我开始搜索时。当搜索特定世代的口袋妖怪时,其他世代的口袋妖怪也会出现。所以我将在索引 2 处,即第 2 代口袋妖怪,在搜索时,将出现来自不同世代的其他口袋妖怪。我不确定它是否是我初始化上下文的方式。这就是我的搜索栏功能的样子。

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchBar == pokemonSearchBar {
        let text = pokemonSearchBar.text!
        self.attemptPokemonFetch(name: text)
        collectionView.reloadData()
    }
}

另一个例子:假设我有 3 种类型的人,有些是瘦的、正常的和胖的。当我在瘦人的索引中时,我只想搜索瘦的人而不是所有人。那么我需要做些什么来实现这种行为。

非常感谢任何帮助。 :)

【问题讨论】:

    标签: ios search core-data swift3 nsfetchedresultscontroller


    【解决方案1】:

    在你的代码中

    request.predicate = NSPredicate(format: "generation = %@", generation)
    if !name.isEmpty {
        request.predicate = NSPredicate(format: "name CONTAINS[cd] %@", name)
    }
    

    第二个赋值替换之前赋值的谓词。 你可能想要的是

    if name.isEmpty {
        request.predicate = NSPredicate(format: "generation = %@", generation)
    } else {
        request.predicate = NSPredicate(format: "generation = %@ AND name CONTAINS[cd] %@", generation, name)
    }
    

    更灵活的方法是使用NSCompoundPredicate

    var predicates = [NSPredicate]()
    predicates.append(NSPredicate(format: "generation = %@", generation))
    if !name.isEmpty {
        predicates.append(NSPredicate(format: "name CONTAINS[cd] %@", name))
    }
    request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicates)
    

    【讨论】:

    • 谢谢马丁,正是我想要的行为。我不知道您可以将 AND 添加到 NSPredicate 格式。新使用谓词,所以我想知道是否可以有一个 OR。例如,在搜索栏中说,我可以让他们按名称或口袋妖怪 ID 进行搜索。这将如何运作?
    • @LuisRamirez:还有一个“或”。查找“谓词编程指南”,您将在其中找到语法说明。
    猜你喜欢
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多