Как искать значение в Firebase IOS - PullRequest
0 голосов
/ 27 ноября 2018

У меня проблема с функцией queryOrdered(), я действительно не знаю, как с ней справиться ...

Предполагая, что моя структура базы данных:

Planes{
Uid{
    SE{
        AutoID{
            .Auto-Id
            .Picture
            .Registration
            .Type
            .model
        }
        AutoID{
            //Same as first one
        }
    }
    ME{
        AutoID{
            //Same as first one
        }
    }
}}

Inв этой части моей базы данных я бы хотел выполнить поиск по .Registration

, поэтому я установил ссылку на Planes > UId

И после этого выполните код:

var acftPickerSelected = aircrafts[listAcftsPicker.selectedRow(inComponent: 0)]

    if let user = Auth.auth().currentUser{
        // user is connect
        let ref = Database.database().reference()
        let userID = Auth.auth().currentUser?.uid

        let ev = ref.child("Planes").child(userID!)

        ev.queryOrdered(byChild: "Registration").queryEqual(toValue: acftPickerSelected).observeSingleEvent(of: .value) { (snapshot: DataSnapshot) in
            for child in snapshot.children {
                let value = snapshot.value as? NSDictionary

                self.pickerRegi = value?["Registration"] as? String ?? "..unknown.."
                self.stdbPickerType = value?["Type"] as? String ?? "..unknown.."
                self.pickerModel = value?["model"] as? String ?? "..unknown.."

                print("Avion : \(self.pickerRegi) - \(self.pickerModel) - \(self.stdbPickerType)")
            }
        }

Но появляется это сообщение:

2018-11-27 18: 03: 54.797824 + 0100 XXXXXXXXXX [12954: 527986] 5.10.0 - [База данных / база данных] [I-RDB034028] Использование неопределенного индекса.Ваши данные будут загружены и отфильтрованы на клиенте.Подумайте о том, чтобы добавить «.indexOn»: «Регистрация» в / Planes / BJMhmQzJXldULc5X9Y2WzjFEs9a2 к вашим правилам безопасности для повышения производительности

Итак, я добавил правила для firebase, например:

{"rules": {
"Planes":{
  "$uid":{
  ".indexOn": ["Registration"],
    ".write": "$uid === auth.uid",
    ".read": "$uid === auth.uid"
  }
},
".read": true,
".write": true}}

А теперь сообщение об ошибке больше не появляется, но в этой части ничего не происходит:

self.pickerRegi = value?["Registration"] as? String ?? "..unknown.."
            self.stdbPickerType = value?["Type"] as? String ?? "..unknown.."
            self.pickerModel = value?["model"] as? String ?? "..unknown.."

            print("Avion : \(self.pickerRegi) - \(self.pickerModel) - \(self.stdbPickerType)")

Как я могу это исправить?

Спасибо за помощь.

1 Ответ

0 голосов
/ 27 ноября 2018

Здесь происходит две вещи:

  1. indexOn
  2. Наблюдатель

, и в этом случае indexOn не является проблемой.

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

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

Реальная проблема заключается в наблюдении, поскольку он недостаточно глубок, чтобы получить данные, к которым вы пытаетесь добраться.Вы пропускаете уровень «SE».Вот переписать

let uidRef = ref.child("Planes").child(userID)
let seRef = uidRef.child("SE") //this is the child node to query
seRef.queryOrdered(byChild: "Registration").queryEqual(toValue: acftPickerSelected)
  .observeSingleEvent(of: .value) { snapshot in
      for child in snapshot.children {
          let childSnap = child as! DataSnapshot
          let dict = childSnap.value as! [String: Any]
          let reg = dict["Registration"] as? String ?? "No Reg"
          let mod = dict["model"] as? String ?? "No Model"
          print(reg, mod)
      }
}

так, как написано в вашем вопросе, запрос запросит следующий уровень: он ожидает найти узел регистрации непосредственно под узлами SE и ME.Но эти узлы содержат только узлы autoId.

EDIT:

Изменение структуры путем выравнивания (денормализации) также будет другим вариантом

Planes
   Uid
      AutoID
         .Auto-Id //note, if the is the same as the key, its not needed
         .Picture
         .Registration
         .Type
         .model
         .se_or_me: "SE"
      AutoID
         .Auto-Id
         .Picture
         .Registration
         .Type
         .model
         .se_or_me: "ME"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...