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?
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).
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) {
}
});