【问题标题】:How to fetch more than 1 Entity at once on Core Data using UISearchBar and NSFetchedResultsController in Swift?如何在 Swift 中使用 UISearchBar 和 NSFetchedResultsController 在 Core Data 上一次获取多个实体?
【发布时间】:2016-05-16 23:49:10
【问题描述】:

大家好,我有一个使用 Core Data 和 NsFetchedResultsController 的应用程序,我正在使用 searchBar 来搜索 3 个实体中的属性。

问题自然是每个实体都有不同的属性。但我想使用来自用户的相同 searchBar 输入一次搜索所有 3 个实体。

所有 3 个实体都有一个属性“name”,其想法是搜索所有在“name”属性中包含 searchBar 字符串的实体。

到目前为止,我只能搜索 1 个实体,因为我正在使用此代码:

// MARK: - Fetched results controller
var fetchedResultsController: NSFetchedResultsController {
    if _fetchedResultsController != nil {
        return _fetchedResultsController!
    }

    let fetchRequest = NSFetchRequest()
    // Edit the entity name as appropriate.

     let entity = NSEntityDescription.entityForName("Category", inManagedObjectContext: moc)
    fetchRequest.entity = entity

    // Set the batch size to a suitable number.
    fetchRequest.fetchBatchSize = 20

    // Edit the sort key as appropriate.
    let sortDescriptor = NSSortDescriptor(key: "index", ascending: true)

    fetchRequest.sortDescriptors = [sortDescriptor]

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)
    aFetchedResultsController.delegate = self
    _fetchedResultsController = aFetchedResultsController

    do {
        try _fetchedResultsController!.performFetch()
    } catch {
        // Replace this implementation with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        //print("Unresolved error \(error), \(error.userInfo)")
        abort()
    }

    return _fetchedResultsController!
}


// MARK: - Search
var searchController: UISearchController? = nil

func reloadFRC(predicate: NSPredicate?) {
    fetchedResultsController.fetchRequest.predicate = predicate
    performFecth()
}

//Delegate: UIsearchController
func updateSearchResultsForSearchController(searchController: UISearchController) {
    if let searchBarText = searchController.searchBar.text {
        var predicate: NSPredicate?
        if searchBarText != "" {
            predicate = NSPredicate(format: "name contains[cd] %@", searchBarText)
        }
        self.reloadFRC(predicate)
    }
}


//Delegate: UISearchBar
func searchBarTextDidEndEditing(searchBar: UISearchBar) {
    self.reloadFRC(nil)
}


//Configure Search
func configureSearch() {
    self.searchController = UISearchController(searchResultsController: nil)
    if let _searchController = self.searchController {
        _searchController.delegate = self
        _searchController.searchResultsUpdater = self
        _searchController.dimsBackgroundDuringPresentation = false
        _searchController.searchBar.delegate = self
        _searchController.searchBar.sizeToFit()
        _searchController.searchBar.barTintColor = Utils.colorFromHex(0x2FC5DA)
        _searchController.searchBar.tintColor = Utils.colorFromHex(0x585858)
        self.tableView.tableHeaderView = _searchController.searchBar
    } else {print("ERROR configuring _searchController in %@", #function)}
}

那么,我该怎么做呢?

【问题讨论】:

    标签: swift core-data ios9 uisearchbar nsfetchedresultscontroller


    【解决方案1】:

    不再需要使用_fetchedResultsController,它几乎与所有 Swift 编码风格背道而驰。此外,您可以替换 nil 检查并改用 lazy 修饰符。您是否有特定的原因要使其成为 lazy 而不仅仅是正常初始化它?如果这是一个搜索屏幕,似乎 99.9% 的时间它都会被初始化。

    现在谈谈您的实体问题。使所有 3 个实体都继承自一个父实体。此父实体将包含 name 属性。然后,您将获取父实体,它将正确搜索所有子实体。

    您还可以通过为NSFetchedResultsController 初始化函数的.sectionNameKeyPath 传入entity.name 来按实体划分它们。如果你决定走这条路,你还需要按entity.name 排序,所以它知道如何对这些部分进行排序。

    【讨论】:

    • 所以我应该从所有 3 个实体中删除“名称”属性并放入父实体中?我不明白搜索如何从父实体访问对象名称。
    • 如果属性被转移到搜索,我怎么能继续向每个实体添加对象?因为正如我所说,每个实体都有“名称”属性,用户需要在每个实体中创建对象。所以,如果我从 3 个实体中删除“名称”并放入父实体,我将如何在 3 个实体上添加工作?你明白我的意思吗?
    • 子实体继承其父实体的所有属性。因此,为父实体定义的任何属性 (name) 也将为子实体定义。这在继承部分解释:developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…
    • 但我不明白如何编写所有这些代码。我创建了一个名为“搜索”的实体并将其设置为其他 3 个的父级。我再次生成了子类,但我不知道如何在代码中实现搜索功能。你能帮我@bsmith11 吗?
    猜你喜欢
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    相关资源
    最近更新 更多