0

I want to know how to search for multi-entry in Firebase.

Now I only can search with one entry(activity name).

The Activity table and i marked * for which i need add to search entry: Activity{ * act_id * act_name * act_region * act_district * act_subDistrict * act_fee * act_type * act_startTime * act_endTime act_status act_owner act_intro }

This is my search controller code. Thank you for your help.

import UIKit
import FirebaseDatabase

class SearchTableViewController: UITableViewController, UISearchResultsUpdating {

let searchController = UISearchController(searchResultsController: nil)

@IBOutlet var searchCenterTableView: UITableView!

var userArray = [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("Activity").queryOrdered(byChild: "act_name").observe(.childAdded, with: { (snapshot) in
        self.userArray.append(snapshot.value as? NSDictionary)
        self.searchCenterTableView.insertRows(at: [IndexPath(row: self.userArray.count-1, section: 0)], with: UITableViewRowAnimation.automatic)
    }) { (error) in
        print(error.localizedDescription)
    }
}

// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if searchController.isActive && searchController.searchBar.text != ""{
        return filteredUsers.count
    }
    return self.userArray.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    let user : NSDictionary?
    if searchController.isActive && searchController.searchBar.text != ""{
        user = filteredUsers[indexPath.row]
    }else{
        user = self.userArray[indexPath.row]
    }

    cell.textLabel?.text = user?["act_name"] as? String
    cell.detailTextLabel?.text = user?["act_subDistrict"] as? String

    return cell
}

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

func filterContent(searchText:String){
    self.filteredUsers = self.userArray.filter{ user in
        let username = user!["act_name"] as? String

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

    tableView.reloadData()
}

}
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
  • Firebase Database queries can only order/filter on a single property. In many cases it is possible to combine the values you want to filter on into a single (synthetic) property. For an example of this and other approaches, see my answer here: https://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase – Frank van Puffelen Apr 22 '20 at 21:50

1 Answers1

0
func filterContent(searchText:String, entries:[String]){
    self.filteredUsers = self.userArray.filter{ user in
         guard let user = user as? User else { return false }
         var array:[Bool] = [Bool]()
         for key in entries {
             let value = user[key] as? String
             let entry = value?.lowercased().contains(searchText.lowercased()) ?? false
             array.append(entry)
         }
        return(array.contains(true))
     }
    tableView.reloadData()
}
Sreekanth M
  • 151
  • 1
  • 6