En tant que novice dans firebase, j'ai essayé d'imiter une sorte de requête "where clause" pour récupérer le portefeuille de l'utilisateur dans ce cas d'utilisation simple:
User
48bde8f8-3b66-40bc-b988-566ccc77335c
email: "[email protected]"
username: "userTest1"
UserWallet
F4PvtvNT2Z
coins: 26
someList
elemet1
elemet2
user: "48bde8f8-3b66-40bc-b988-566ccc77335c"
J'ai d'abord essayé de coder ma demande 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 était nul, alors j'ai écrit cette requête:
Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");
Le résultat était à nouveau nul. Le seul moyen de récupérer le portefeuille était d'utiliser cette requête:
Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c");
Donc, dois-je toujours utiliser la requête "orderByChild ()" avant d'utiliser "equalTo ()"?
Et donc, quel est le but de la requête "equalTo (valeur de chaîne, clé de chaîne)" par rapport à "equalTo (valeur de chaîne) puisque seul le second fonctionne correctement?
Il existe des cas Edge qui n'ont pas besoin d'une orderBy...()
, mais en général, vous aurez besoin d'une orderBy...()
avant une opération de filtrage (equalTo()
, startAt()
, endAt()
).
Je vous recommande vivement de lire au préalable le guide de programmation de Firebase pour Android (95% s’appliquent également à Java standard). Quelques heures passées dans ce guide vous éviteront des dizaines de questions. Par exemple: ceci est la section sur les requêtes .
Après avoir lu cela, vous pouvez aussi lire ce guide sur NoSQL Data Modeling . Il couvre de nombreux modèles courants dans la modélisation de données NoSQL et vous aidera à comprendre très tôt que tenter de mapper des requêtes SQL sur une base de données NoSQL est une idée logique, mais rarement bonne.
Mon modèle initial (sans aucune idée de vos cas d'utilisation, sauf pour le modèle "J'ai besoin de pouvoir trouver les portefeuilles d'un utilisateur"):
UserWallet
"48bde8f8-3b66-40bc-b988-566ccc77335c"
"F4PvtvNT2Z"
coins: 26
someList
element1
element2
Dans le modèle ci-dessus, j'ai inversé Wallet
et User
sous UserWallet
, de sorte que la recherche du portefeuille d'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 aussi rapide que le nombre d'utilisateurs de votre base de données.
Ou bien:
User
"48bde8f8-3b66-40bc-b988-566ccc77335c"
email: "[email protected]"
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, accédez à UserWaller/$uid
, puis chargez chaque portefeuille à partir de Wallets/$walletid
. Ce sera peut-être un peu plus de code, mais ce sera extrêmement efficace (puisqu'il n'y a pas de requêtes impliquées).
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) {
}
});