Как использовать Firebase query equalTo (значение, ключ)?

Будучи новичком в firebase, я попытался воспроизвести некий запрос «where clause» для извлечения кошелька пользователя в этом простом случае:

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" 

Сначала я попытался запрограммировать свой запрос следующим образом:

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

Результат был null, поэтому я написал этот запрос:

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

Результат снова был нулевым. Единственным способом получить кошелек был этот запрос:

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

Поэтому Должен ли я всегда использовать запрос «orderByChild ()» перед тем, как использовать «equalTo ()»?
Итак, какова цель запроса «equalTo (String value, String key)» по сравнению с «equalTo (String value), так как только второй работает правильно?

Solutions Collecting From Web of "Как использовать Firebase query equalTo (значение, ключ)?"

Есть некоторые краевые случаи, для которых не требуется orderBy...() , но в общем случае вам понадобится orderBy...() до операции фильтрации ( equalTo() , startAt() , endAt() ).

Я настоятельно рекомендую вам сначала прочитать руководство по программированию Firebase для Android (95% его относится и к обычной Java). Несколько часов, проведенных в этом руководстве, сохранят здесь несколько десятков вопросов. Например: это раздел по запросам .

Прочитав это, вы также можете прочитать это руководство по NoSQL Data Modeling . Он охватывает множество распространенных шаблонов в моделировании данных NoSQL и поможет вам осознать, что попытка сопоставить SQL-запросы с базой данных NoSQL – логичная идея, но редко хорошая.

Мой первоначальный (без каких-либо представлений о ваших случаях использования, за исключением «Я должен быть в состоянии найти кошельки для пользователя»):

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

В приведенной выше модели я перевернул « Wallet и « User в UserWallet , чтобы UserWallet поиск кошелька (ов) для пользователя.

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

Обратите внимание, что здесь нет никакого запроса, поэтому загрузка будет одинаково быстрой, независимо от того, сколько у вас пользователей в вашей базе данных.

Или, альтернативно:

 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" 

Теперь мы полностью сгладили структуру. Чтобы определить кошельки пользователя, перейдите в UserWaller/$uid а затем загрузите каждый кошелек из кошельков Wallets/$walletid . Это может быть немного больше кода, но он будет чрезвычайно эффективным (поскольку в нем нет запросов).

Вы можете использовать вложенный запрос для этого.! Если у вас есть несколько случайных идентификаторов, вы можете легко их сравнить.! 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) { } });