【问题标题】:Firestore Query Not Returning Data Based on searchTextFirestore 查询不返回基于 searchText 的数据
【发布时间】:2021-03-15 14:18:27
【问题描述】:

我的 searchBar 文本正在更新我的查询,但没有像我预期的那样从 Firestore 返回数据。

这是我的数据模型中的方法:

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", isGreaterThanOrEqualTo: searchText) 是否可能是我问题的根源。当我在此代码之后print(searchText) 时,我键入的searchText 按预期显示在控制台中。但是表格视图不会随着具有匹配 title 的单元格更新,即使它是完全 匹配。

【问题讨论】:

    标签: ios swift firebase google-cloud-firestore uisearchbar


    【解决方案1】:
     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
         }
    }
    

    【讨论】:

      【解决方案2】:

      问题最终植根于包含正确大小写值的数据库中,而我的查询都是小写的。显然是recommended to store my searchable data in its own key,所以我为要搜索的数据创建了一个关键字数组。

      然后我的查询变成了: query = query.whereField("keywords", arrayContains: searchText)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-22
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多