Параметры запроса Firestore Swift - PullRequest
0 голосов
/ 01 мая 2018

У меня есть проблема, связанная с запросом Firestore. В настоящее время у меня есть структура Firestore, как показано ниже.

enter image description here

Я хочу создать поисковую систему, в которой у пользователя есть возможность фильтровать программу, статус и категорию. Ниже приведен исходный код фильтра:

var filterProg = ""
var filterStat = ""
var filterCat = ""

   @IBAction func filterButtonDidTapped(_ sender: Any) {
    self.agencyList.removeAll()

  db.collection("fund")


 .whereField("programme", isEqualTo: filterProg )


 .whereField("status", isEqualTo: filterStat )


 .whereField("category", isEqualTo: filterCat )

        .getDocuments()
            {
                (querySnapshot, err) in

                if let err = err
                {
                    print("Error getting documents: \(err)");
                }
                else
                {
                    //  var agencyNumber = 0
                    for document in querySnapshot!.documents {
                        let data = document.data()
                        let agencyy = data["age"] as? String ?? ""
                        let title = data["name"] as? String ?? ""
                        let agencyId = document.documentID
                        print(title)
                        print(agencyy)
                        print(agencyId)

                        let newModel = DisplayModel(agency: title, agencyId: agencyId)
                        self.agencyList.append(newModel)
                       // self.originalData.append(title)
                    }
                    self.tableView.reloadData()
                }
    }

}

из приведенного выше кода переменные filterProg, filterStat и filterCat изменится с пустой строки "" на некоторую строку из UIPicker в зависимости от выбора пользователя. Проблема в том, что если пользователь решит выполнить фильтрацию только для filterProg (программа) и filterStat (состояние), переменная fileterCat останется пустой строкой "". Это привело к тому, что данные из firestore ничего не отображали. Я пробовал что-то вроде: проверить, является ли переменная пустой строкой или нет, как показано ниже:

let query = db.collection("fund")

if filterProg != "" {
 query.whereField("programme", isEqualTo: filterProg )
}

if filterProg != "" {
 query.whereField("status", isEqualTo: filterStat )
}
 if filterProg != "" {
 query.whereField("category", isEqualTo: filterCat )
}
    .getDocuments() //got error here
        {
            (querySnapshot, err) in

Я получил ошибку .getDocuments()

Ссылка на член 'getDocuments' не может быть разрешена без контекстный тип

Я застрял с этой проблемой на неделю. На самом деле, возможно ли установить фильтр на Firestore?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Сначала вам нужно будет построить базу вашего запроса:

let query = db.collection("fund")

Затем добавьте условия к вашему запросу на основе значений, введенных пользователем:

if filterProg != "" {
 query = query.whereField("programme", isEqualTo: filterProg )
}
if filterProg != "" {
 query = query.whereField("status", isEqualTo: filterStat )
}
if filterProg != "" {
 query = query.whereField("category", isEqualTo: filterCat )
}

И, наконец, получите документы, соответствующие запросу:

query.getDocuments() {
  (querySnapshot, err) in ...
0 голосов
/ 01 мая 2018

Я не верю, что это возможно в настоящее время, но может быть обходной путь, чтобы создать ваш запрос в зависимости от результата проверки ваших полей на наличие допустимых строк.

var query: Query!

if /* some condition */ {

    query = db.collection("fund").whereField("programme", isEqualTo: filterProg)

} else if /* condition */ {

    query = db.collection("fund").whereField("status", isEqualTo: filterStat)

} // etc

query.getDocuments { (snapshot, error) in
            //
        }

Улучшения в запросах пожарных хранилищ находятся на радаре: https://github.com/firebase/firebase-js-sdk/issues/321

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...