web-dev-qa-db-fra.com

Comment obtenir la clé de la valeur dans Firebase

Comment puis-je obtenir la clé "-KLpcURDV68BcbAvlPFy" lorsque je sais que le champ "nom" contient "efg" dans la structure suivante dans Firebase.

clubs
    -KLpcURDV68BcbAvlPFy
        dept: "abc"
        desc: "xyz"
        name: "efg"
    -asdasdasddsad
        dept: "asda"
        desc: "asd"
        name: "adddd"

J'ai essayé mais il est revenu "clubs"

mDatabase.child("clubs").orderByChild("name").equalTo("efg").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String clubkey =dataSnapshot.getKey();
10
THe_strOX

C'est parce que vous utilisez un ValueEventListener. Si la requête correspond à plusieurs enfants, elle renvoie une liste de tous ces enfants. Même s'il n'y a qu'un seul enfant correspondant, c'est toujours une liste d'un enfant. Et puisque vous appelez getKey() sur cette liste, vous obtenez la clé de l'emplacement où vous avez exécuté la requête.

Pour obtenir la clé des enfants correspondants, passez en boucle sur les enfants de l'instantané:

mDatabase.child("clubs")
         .orderByChild("name")
         .equalTo("efg")
         .addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
            String clubkey = childSnapshot.getKey();

Mais notez que si vous supposez que le nom du club est unique, vous pouvez aussi bien stocker les clubs sous leur nom et accéder au bon sans une requête:

mDatabase.child("clubs")
         .child("efg")
         .addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String clubkey = dataSnapshot.getKey(); // will be efg
17
Frank van Puffelen

Si quelqu'un a besoin de le faire en utilisant Kotlin:

mDatabase.child("clubs")
        .orderByChild("name")
        .equalTo("efg")
        .addListenerForSingleValueEvent(object: ValueEventListener {

            override fun onDataChange(dataSnapshot: DataSnapshot) {

                dataSnapshot.children.forEach {
                     //"it" is the snapshot
                     val key: String = it.key.toString()
                }
            }

            override fun onCancelled(p0: DatabaseError) {
                    //do whatever you need
            }
         })
1
Rob

Si cette clé (asdasdasddsad) avait également le nom: "efg" la clé du club deviendra asdasdasddsad et KLpcURDV68BcbAvlPFy

0
Chirag Gupta