8
votes

Firebase Récupération de données à Swift

J'essaie de récupérer des données spécifiques à partir de l'utilisateur actuellement connecté. Mes données dans ma base de données ressemblent à ceci:

Entrez la description de l'image ici

pour Exemple, je veux juste attraper le nom complet et l'enregistrer dans une variable nom d'utilisateur. Ci-dessous, c'est ce que j'utilise pour saisir mes données xxx

malheureusement, c'est ce que ma console imprime.

 Entrez la description de l'image ici

J'apprécierais toute aide :) Merci!


2 commentaires

Hey tim. Faites-vous l'authentification? De quoi utilisez-vous?


J'essaie d'enregistrer les données à une variable locale afin que je puisse l'utiliser pour afficher les choses :-)


6 Réponses :


13
votes

Cela vous donne ce message d'avertissement indexon code> parce que vous faites une requête.

Vous devez définir les touches que vous indexerez via le .indexon. Règle dans vos règles de sécurité et de firebase. Pendant que vous êtes autorisé à Créez ces questions ad-hoc sur le client, vous verrez grandement amélioration des performances lorsque vous utilisez .indexon p> blockQuote>

Comme vous savez que le nom que vous recherchez, vous pouvez directement aller sur ce nœud, sans requête. P>

    let ref:FIRDatabaseReference! // your ref ie. root.child("users").child("stephenwarren001@yahoo.com")

    // only need to fetch once so use single event

    ref.observeSingleEventOfType(.Value, withBlock: { snapshot in

        if !snapshot.exists() { return }

        //print(snapshot)

        if let userName = snapshot.value["full_name"] as? String {
            print(userName)
        }
        if let email = snapshot.value["email"] as? String {
            print(email)
        }

        // can also use
        // snapshot.childSnapshotForPath("full_name").value as! String
    })


9 commentaires

Xcode m'a suggéré d'ajouter un "!" Après de la valeur que je ne suis pas sûr, c'est ce que nous devrions faire ... En fait, cela pourrait être ce qui le fait crash (?)


C'est une force déballe d'une facultative - si cette valeur n'existe pas, elle se bloque.


En outre, en fonction de votre modèle de modèle, vous pouvez récupérer plusieurs instantanés. Alors, vous utiliseriez tous les snapshot.children et la boucle à travers tous. Ce tutoriel est bon pour ces bases Raywenderlich.com/109706/fireBase-Toriartial-geting -Starté - Le guide de démarrage Firebase est également très très bon! Firebase.google.com/docs/ios/SetUp


Devrais-je être forcé de le déballer? Je soupçonne que je ne devrais pas être puisque tout le monde l'a écrit sans le "!". Xcode ne construira pas sauf si je force la valeur de débit


Je créerais une structure, c'est-à-dire une personne qui passe dans l'instantané puis de traiter les informations dans l'instantané. Faites ce que le complier suggère de l'obtenir tot. Forcer le débouché est d'accord si vous savez que ce ne va pas être nul.


Hm il ne semble toujours pas l'affaire pour moi et j'ai aussi essayé le commentaire (Snapshot.childsnapshotforpath ("Full_Name"). Valeur as! String) et je reçois l'erreur "Impossible de lancer la valeur de type" Nsnull "à ' Nstring '). J'ai essayé aussi de regarder à travers le lien de tutoriel mais je ne pouvais pas trouver spécifiquement comment récupérer certaines données :-(


Désolé pour toutes ces questions


Pas de soucis - peu à peu, vous en comprendrez plus sur FireBase. Regardez les tutoriels de rayons que j'ai postés avant de vous aider beaucoup.


Quel est le 3 moyen de faire ça? Snapshot.Value ["Key"] ne semble plus fonctionner



2
votes
{
    "rules": {
         "tbl_name": {
            ".indexOn": ["field_name1", "field_name2"]
         },
    ".read": true,
    ".write": true
    }
}
You can apply indexOn on any field. Add this json in rules security and rules tab.
Hope this works for you. :)

0 commentaires

2
votes

Il récupère les données utilisateur enregistrées:

let ref = FIRDatabase.database().reference(fromURL: "DATABASE_URl")
let userID = FIRAuth.auth()?.currentUser?.uid
let usersRef = ref.child("users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in
print(snapshot)


0 commentaires

7
votes

SWIFT 4 xxx


1 commentaires

Devrait regarder quelque chose comme celui-ci dans la version actuelle, laissez ref = base de données.database (). Référence () Let userid = auth.auth (). CurnUser? .Uid ref.child ("Utilisateurs"). Enfant (Userid ?? "" ) .observesingleEvent (de: .value, avec: {(instantané) dans})



2
votes
let ref = Database.database().reference().child("users/stephenwarren001@yahoo.com")


    ref.observeSingleEvent(of: .value, with: { (snap : DataSnapshot)  in

        print("\(String(describing:  snap.value))")


    }) { (err: Error) in


        print("\(err.localizedDescription)")

    }

1 commentaires

Merci pour ce code Snippet, qui pourrait fournir une aide immédiate limitée. Une explication appropriée améliorerait considérablement sa valeur à long terme en montrant pourquoi il s'agit d'une bonne solution au problème et de Rendez-le plus utile pour les futurs lecteurs avec d'autres questions similaires. S'il vous plaît Modifier Votre réponse Pour ajouter une explication, y compris les hypothèses que vous avez apportées.



0
votes
    var refDatabase = DatabaseReference()

    refDatabase = Database.database().reference().child("users");
 let refUserIdChild = refDatabase.child("stephenwarren001@yahoo.com")
                    
                    refUserIdChild.observeSingleEvent(of: .value, with: { snapshot in

                        if !snapshot.exists() { return }

                        print(snapshot) // Its print all values including Snap (User)

                        print(snapshot.value!)
                        

                    if let tempDic : Dictionary = snapshot.value as? Dictionary<String,Any>
                    {
                           
                            if let userName = tempDic["full_name"] as? String {
                                  self.tfName.text = userName

                              }

                            if let email = tempDic["email"] as? String {
                                    self.tfEmail.text  = email

                              }

                           
                    }


                    })
                    

0 commentaires