Comment utiliser Firebase requête equalTo(valeur de la clé)?

comme un internaute novice dans firebase j'ai essayé d'imiter une sorte de" clause où " demande de récupérer le portefeuille de l'utilisateur dans ce cas simple d'utilisation:

User
   48bde8f8-3b66-40bc-b988-566ccc77335c
      email: "toto@acme.com"
      username: "userTest1"

UserWallet
   F4PvtvNT2Z
      coins: 26
      someList
         elemet1
         elemet2 
      user: "48bde8f8-3b66-40bc-b988-566ccc77335c"

j'ai d'Abord essayé de code de ma requête comme ceci:

Firebase root = new Firebase("https://myApp.firebaseio.com/");
Firebase ref = root.child("UserWallet");
Query query = ref.equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");

Le résultat est null, Alors j'ai écrit cette requête:

Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");

résultat nul à nouveau. La seule façon de récupérer le portefeuille était avec cette requête:

Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c");

donc je devrais toujours utiliser la requête en "orderByChild ()" avant d'utiliser "equalTo ()"?

Et donc, quel est le but de la requête "equalTo(valeur de chaîne, clé de chaîne)" comparer à "equalTo(valeur de chaîne) puisque seule la seconde fonctionne correctement?

16
demandé sur gnB 2016-02-22 14:35:19

2 réponses

il y a des cas de bord qui n'ont pas besoin d'un orderBy...(), mais en général, vous aurez besoin d'un orderBy...() avant une opération de filtrage (equalTo(),startAt(),endAt()).

je vous recommande fortement de lire d'abord le Firebase guide de programmation pour Android (95% s'applique aussi à Java). Quelques heures passées dans ce guide, vous éviterez des douzaines de questions ici. Par exemple: c'est le section sur les requêtes.

après avoir lu que, vous pouvez aussi lire ce guide sur NoSQL Data Modeling. Il couvre de nombreux modèles communs dans la modélisation de données NoSQL et vous aidera à vous rendre compte au début que d'essayer de cartographier les requêtes SQL à une base de données NoSQL est une idée logique, mais rarement une bonne.

mon initiale (sans aucune idée de vos cas d'utilisation, sauf pour "j'ai besoin de pouvoir trouver les portefeuilles pour un utilisateur") modèle:

UserWallet
   "48bde8f8-3b66-40bc-b988-566ccc77335c"
      "F4PvtvNT2Z"
         coins: 26
         someList
            element1
            element2 

Dans le modèle ci-dessus, j'ai inversé l' Wallet et User sous UserWallet, de sorte que la recherche de la portefeuille(s) pour un utilisateur devient plus facile.

ref.child('UserWallet').child(auth.uid).addValueEventListener(...

notez qu'il n'y a pas de requête impliquée ici, donc le chargement sera tout aussi rapide peu importe le nombre d'utilisateurs que vous avez dans votre base de données.

ou alternativement:

User
   "48bde8f8-3b66-40bc-b988-566ccc77335c"
      email: "toto@acme.com"
      username: "userTest1"

Wallet
   "F4PvtvNT2Z"
      coins: 26
      someList
         element1
         element2 

UserWallet
   "48bde8f8-3b66-40bc-b988-566ccc77335c"
      "F4PvtvNT2Z"

maintenant nous avons complètement aplati la structure. Pour déterminer les portefeuilles d'un utilisateur, vous allez à UserWaller/$uid et ensuite charger chaque portefeuille de Wallets/$walletid. C'est peut-être un peu plus de code, mais ce sera extrêmement efficace. (car il n'y a pas de requêtes).

7
répondu Frank van Puffelen 2016-02-22 18:27:45

Vous pouvez utiliser la requête imbriquée pour cela.! si vous avez plusieurs identifiants aléatoires, vous pouvez facilement les comparer.! DatabaseReference reference = FirebaseDatabase.getInstance().getReference ();

    Query query = reference.child("user");
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                // dataSnapshot is the "issue" node with all children with id 0
                for (DataSnapshot issue : dataSnapshot.getChildren()) {
                    // do something with the individual "issues"

Query query = reference.child("user").child(dataSnapshot.getKey().equals(YourData)));
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {






                }

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
0
répondu Atif AbbAsi 2017-07-30 12:30:19