Search code examples
swiftfirebase-realtime-databasesearchbar

Xcode/Firebase Improving search function


I'm new to both Xcode and firebase. I made this search bar yesterday, but I only had it to search for one thing (String). And now I'm asking how to search for all the data. The data is from firebase and is both numbers and text look it:

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

The code:

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)
    }

And here is the function:

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()

}

Any clue on how to search for more than "Fornavn", text?


Solution

  • You can do something like this:

    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()
    
    }
    

    Note: Please use optional binding to unwrap optionals in your code