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

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

User
   48bde8f8-3b66-40bc-b988-566ccc77335c
      email: "[email protected]"
      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), поскольку только второй работает правильно?

Ответы

Ответ 1

Есть некоторые случаи кросс, которые не нуждаются в 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, так что поиск кошелька для пользователя становится проще.

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

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

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

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"

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

Ответ 2

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

        }
    });