Xcode/Firebase 改进搜索功能
Xcode/Firebase Improving search function
我是 Xcode 和 firebase 的新手。
我昨天做了这个搜索栏,但我只用它来搜索一件事(字符串)。现在我问如何搜索所有数据。
数据来自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" 个文本的任何线索?
你可以这样做:
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()
}
注意:请在您的代码中使用可选绑定来解包可选
最佳做法是不使用 firebase 查询来搜索数据。
您可以使用第三方服务,如 Algolia 或 Elastic Search,并使用 Cloud Functions 同步您的索引。
这里的云函数示例:Full-text search via Algolia
不同的方法:
让你的用户平等
对您要搜索的每个字段进行单参数查询。
let databaseQuery = Database.database().reference().child("users")
.queryOrdered(byChild: "nickname")
.queryStarting(atValue: query).queryEnding(atValue: "\(query)\u{f8ff}")
运行 通过观察单个 .value
事件进行的所有查询
使用调度组确保所有查询完成。
将结果组合成一个集合(使所有发现的结果都独一无二)
随意排序
显示结果
我是 Xcode 和 firebase 的新手。 我昨天做了这个搜索栏,但我只用它来搜索一件事(字符串)。现在我问如何搜索所有数据。 数据来自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" 个文本的任何线索?
你可以这样做:
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()
}
注意:请在您的代码中使用可选绑定来解包可选
最佳做法是不使用 firebase 查询来搜索数据。 您可以使用第三方服务,如 Algolia 或 Elastic Search,并使用 Cloud Functions 同步您的索引。
这里的云函数示例:Full-text search via Algolia
不同的方法:
让你的用户平等
对您要搜索的每个字段进行单参数查询。
let databaseQuery = Database.database().reference().child("users")
.queryOrdered(byChild: "nickname")
.queryStarting(atValue: query).queryEnding(atValue: "\(query)\u{f8ff}")
运行 通过观察单个
.value
事件进行的所有查询使用调度组确保所有查询完成。
将结果组合成一个集合(使所有发现的结果都独一无二)
随意排序
显示结果