Xcode / Firebase改进搜索功能

时间:2017-09-19 06:41:17

标签: swift firebase-realtime-database searchbar

我是Xcode和firebase的新手。 我昨天做了这个搜索栏,但我只用它搜索一件事(String)。现在我要问如何搜索所有数据。 这些数据来自firebase,数字和文字都是这样的:

"Fornavn" - Text,
"Efternavn" - Text,
"Personnr" - Numbers

代码:

import UIKit
import FirebaseDatabase

class FindTableViewController: UITableViewController, 
UISearchResultsUpdating {

@IBOutlet var FindTableView: UITableView!

let searchController = UISearchController(searchResultsController: nil)

var usersArray = [NSDictionary?]()
var filteredUsers = [NSDictionary?]()
var databaseRef = Database.database().reference()

override func viewDidLoad() {
    super.viewDidLoad()

    searchController.searchResultsUpdater = self
    searchController.dimsBackgroundDuringPresentation = false
    definesPresentationContext = true
    tableView.tableHeaderView = searchController.searchBar

    databaseRef.child("Buyers").queryOrdered(byChild: "personnr").observe(.childAdded, with: {(snapshot) in
    self.usersArray.append(snapshot.value as? NSDictionary)

        self.FindTableView.insertRows(at: [IndexPath(row:self.usersArray.count-1,section:0)], with: UITableViewRowAnimation.automatic)

    })
    { (error) in
        print(error.localizedDescription)
    }

这是功能:

func updateSearchResults(for searchController: UISearchController) {
    filterUsers(searchText: self.searchController.searchBar.text!)
}

func filterUsers (searchText:String) {
    self.filteredUsers = self.usersArray.filter{ user in

        let username = user!["Fornavn"] as? String

       return(username?.lowercased().contains(searchText.lowercased()))!

   }

    tableView.reloadData()

}

有关如何搜索超过" Fornavn",文字的任何线索?

3 个答案:

答案 0 :(得分:1)

您可以这样做:

func filterUsers (searchText:String) {
    self.filteredUsers = self.usersArray.filter{ user in
        var searchResultForUserName = false
        var searchResultForSecondSearch = false 
        var searchResultForThirdParam = false
        if let username = user!["Fornavn"] as? String {
               searchResultForUserName =  username.lowercased().contains(searchText.lowercased())
        }
        if  let secondSeachedStr = user!["Efternavn"] as? String {
                   searchResultForSecondSearch =  secondSeachedStr.lowercased().contains(searchText.lowercased())
       }
       if let number = user!["Personnr"] as? String {

             searchResultForThirdParam = number.lowercased().contains(searchText.lowercased()) 
       } 

       return searchResultForUserName || searchResultForSecondSearch || searchResultForThirdParam 


   }

    tableView.reloadData()

}

注意:请使用可选绑定来解码代码

中的选项

答案 1 :(得分:0)

最佳做法是不使用firebase查询来搜索数据。 您可以使用Algolia或Elastic Search等第三方服务,并使用云功能同步索引。

云功能示例:Full-text search via Algolia

答案 2 :(得分:0)

不同的方法:

  1. 让您的用户等同

  2. 为您要搜索的每个字段进行单个参数查询。

  3. let databaseQuery = Database.database().reference().child("users") .queryOrdered(byChild: "nickname") .queryStarting(atValue: query).queryEnding(atValue: "\(query)\u{f8ff}")

    1. 通过观察单个.value事件

    2. 来运行所有查询
    3. 使用调度组确保所有查询完成。

    4. 将结果组合在一起(使所有创建者成为唯一的)

    5. 按您喜欢的方式排序

    6. 显示结果