从Firebase实时数据库中读取特定数据

时间:2019-10-20 04:07:02

标签: swift firebase-realtime-database

我创建了一个Firebase数据库,用于存储注册到我的应用程序的用户。 数据库结构是

enter image description here

我的代码检索保存到我的数据库中的所有用户

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    let database = Database.database().reference()
    let usuarios = database.child("usuarios")

    usuarios.observe(DataEventType.childAdded) { (snapshot) in
        let dados = snapshot.value as? NSDictionary

        let autenticacao = Auth.auth()
        let idUsuarioLogado = autenticacao.currentUser?.uid

        let emailUsuario = dados?["email"] as! String
        let nomeUsuario = dados?["nome"] as! String
        let perfilUsuario = dados?["perfil"] as! String
        let idUsuario = snapshot.key

        let usuario = Usuario(email: emailUsuario, nome: nomeUsuario, uid: idUsuario, perfil: perfilUsuario)
        print("\(usuario.email) e \(usuario.nome) e \(usuario.uid) e \(usuario.perfil)")

        autenticacao.addStateDidChangeListener { (autenticacao, usuario) in
            if let usuarioLogado = usuario {

                print("Test")
            }
        }
     }

}

上面代码的结果是

Authenticated user Optional("NjZhCqk9pnSlTltfZl6oxa5vdd53")
aa@gmail.com e aa e NjZhCqk9pnSlTltfZl6oxa5vdd53 e usuario
Authenticated user Optional("NjZhCqk9pnSlTltfZl6oxa5vdd53")
bb@gmail.com e bb e OzZjDzH1IyNE8IRQFAkqEgEUr5v2 e usuario
Authenticated user Optional("NjZhCqk9pnSlTltfZl6oxa5vdd53")
cc@gmail.com e cc e Y0WBAz6kEXQKMg3LjW4V2Vx8kzz1 e usuario

我希望检索与已登录用户(并非全部)相关的“性能”,但是,使用我的代码,我可以检索所有用户信息。

如何从当前登录用户中仅检索“性能”?

2 个答案:

答案 0 :(得分:2)

现在,您正在读取usarios下的所有数据并进行打印。如果只想读取当前用户的数据,则应观察该特定节点。为此,首先确定当前用户的UID,然后将观察者附加到该特定子节点。

类似这样的东西:

if Auth.auth().currentUser != nil {
    let uid = Auth.auth().currentUser?.uid

    let database = Database.database().reference()
    let usuarios = database.child("usuarios")

    usuarios.child(uid).observe(.value) { (snapshot) in
        let dados = snapshot.value as? NSDictionary

        let emailUsuario = dados?["email"] as! String
        let nomeUsuario = dados?["nome"] as! String
        let perfilUsuario = dados?["perfil"] as! String
        let idUsuario = snapshot.key

        let usuario = Usuario(email: emailUsuario, nome: nomeUsuario, uid: idUsuario, perfil: perfilUsuario)
        print("\(usuario.email) e \(usuario.nome) e \(usuario.uid) e \(usuario.perfil)")
     }
}

如果在创建视图时登录了用户的数据,它将从数据库中读取用户的数据。如果您希望在登录时始终加载该数据,即使以后再登录,也将使用addStateDidChangeListener。与您已经执行的操作类似,但是在这种情况下,您应该将观察者附加在内部。

答案 1 :(得分:0)

我认为您需要获取用户ID,然后读取特定的孩子让usuario = database.child(“ usuarios”)。child(idUsuarioLogado)。如果您开始这个项目,我建议您看一下Firestore,这样会更好。

let autenticacao = Auth.auth()
let idUsuarioLogado = autenticacao.currentUser?.uid
// Do any additional setup after loading the view.
let database = Database.database().reference()
let usuarios = database.child("usuarios").child(idUsuarioLogado)

usuario.observe(.value) { (snapshot) in
    ....