Ios Firestore查询不返回基于searchText的数据
我的搜索栏文本正在更新我的查询,但没有像我预期的那样从Firestore返回数据 这是我的数据模型中的方法:Ios Firestore查询不返回基于searchText的数据,ios,swift,firebase,google-cloud-firestore,uisearchbar,Ios,Swift,Firebase,Google Cloud Firestore,Uisearchbar,我的搜索栏文本正在更新我的查询,但没有像我预期的那样从Firestore返回数据 这是我的数据模型中的方法: func getMealPlans(starred starredOnly:Bool = false, textToQuery searchText:String = "") { listener?.remove() let db = Firestore.firestore() va
func getMealPlans(starred starredOnly:Bool = false, textToQuery searchText:String = "") {
listener?.remove()
let db = Firestore.firestore()
var query:Query = db.collection("mealPlans")
query = query.whereField("title", isGreaterThanOrEqualTo: searchText)
func queryData() {
self.listener = query.addSnapshotListener({ (snapshot, error) in
// Check for errors
if error == nil && snapshot != nil {
var mealPlans = [MealPlan]()
// Parse documents into mealPlans
for doc in snapshot!.documents {
let m = MealPlan(
docID: doc["docID"] as? String,
title: doc["title"] as! String)
mealPlans.append(m)
}
// Call the delegate and pass back the notes in the main thread
DispatchQueue.main.async {
self.delegate?.mealPlansRetrieved(mealPlans: mealPlans)
}
}
})
}
queryData()
}
这是我在视图控制器中的搜索栏方法:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
let searchedText = searchText.lowercased()
model.getMealPlans(textToQuery: searchedText)
self.tableView.reloadData()
}
我想知道我的模型中的
query=query.whereField(“title”,大于或等于qualto:searchText)
是否是我的问题的根源。当我在此代码之后打印(searchText)时,我键入的searchText
将按预期显示在控制台中。但是表视图不会使用具有匹配的标题的单元格进行更新,即使它是完全匹配的。问题最终在包含正确大小写值的数据库中生根,而我的查询都是小写的。显然是的,所以我创建了一个关键字数组来搜索我的数据
我的问题是:
query=query.whereField(“关键字”,数组内容:searchText)
You need to use document data property to load MealPlan. Better make it the following way:
1. Define data model as Codable:
import Foundation
import FirebaseFirestore
import FirebaseFirestoreSwift
struct MealPlan: Codable {
@DocumentID var id: String?
title: String?
}
2. Then use compact map to get mealPlans:
mealPlans = snapshot.documents.compactMap { document -> MealPlan? in
do {
let result = try document.data(as: MealPlan.self)
return result
}
catch {
print(error)
return nil
}
}