当前位置: 首页 > 知识库问答 >
问题:

Firestore查询不返回基于searchText的数据

壤驷康裕
2023-03-14

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

共有2个答案

邵麒
2023-03-14
 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
     }
}
章涵容
2023-03-14

你需要完成

func getMealPlans(starred starredOnly:Bool = false, textToQuery searchText:String = "",completion:@escaping(() ->([MealPlan]))) {
    listener?.remove()
    let db = Firestore.firestore()
    var query:Query = db.collection("mealPlans")
    query = query.whereField("title", isGreaterThanOrEqualTo: searchText)
    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) // remove this if you need to as callback will deliver the result to you
                completion(mealPlans)
            }
        }
   })
}

然后

model.getMealPlans(textToQuery: searchedText) {  res in
    // change table model to res here 
    self.tableView.reloadData() 
}
 类似资料:
  • 我在集合中有大约30条记录,其中几乎25条包含单词。现在,当我尝试使用时,它不会返回任何东西。 下面是我的查询代码: 下面是我的Firestore截图:

  • 因此,我正在构建一个云函数,它接受customerID,根据customerID过滤文档,并返回文档列表。遗憾的是,它返回一个空数组。我相信这是一个简单的解决办法。 以下是云功能: 下面是我从客户端调用它时的代码。 此外,这里是一个萤火虫的屏幕截图。 firestore的截图

  • 我有一个mysql查询,它连接5个不同的表以返回产品的特定属性。它应该只返回每个产品一次。但是由于产品可能有多个类别,它为每个类别返回产品一次。 以下是选择: 如果给定的产品,比如product_id32被分配到多个类别,它将为每个类别返回一次product_id32,唯一的区别是结果是类别名称。 如果有人可以帮助返工选择只包括每个产品一次,无论类别我将不胜感激的帮助。 将类别恢复为产品的MAX(

  • 问题内容: 如何获取使用SQL Server的SQL查询返回的列数? 例如,如果我有如下查询: 它应该返回表A1中的总列数+表A2中的总列数。但是查询可能会更复杂。 问题答案: 这是一种方法: 您可以通过创建视图来执行类似的操作。

  • 我正在尝试使用一个以我的类单元格为键的HashMap。但是,在将项放入HashMap之后,对该项调用contains将返回false。 这会打印出false和true,在这里应该打印true和true,因为根据映射,docs containsKey使用.equals()。我做错了什么?