Найти, существует ли дочерний элемент внутри дочерних данных, или нет Android Firebase - PullRequest
0 голосов
/ 05 ноября 2018

Это может быть дубликатом Вопрос, но у меня много попыток, но я не получил свой результат, Вот моя структура Firebase

database

Обновлено

Мне нужно выяснить, существует ли дочерний объект costName (например, это может быть oil ), не находящийся под всем узлом November_2018 (внутри красной рамки). Если существует, мне нужно отобразить тост

Ниже приведен код, который я пробовал:

//Here monthyr is the November_2018
      expensesaddref = databaseReference.child(username).child("Expense_Month").child(monthyr);
     //Variable expensesname is the variable that i want to  checked for existent
           expensesaddref.orderByChild("expensesName").equalTo(expensesname).addListenerForSingleValueEvent(new ValueEventListener() {
               @Override
               public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                   for (DataSnapshot ds : dataSnapshot.getChildren()) {
                       Log.d("List Exp","1 loop");
                       for(DataSnapshot data : ds.getChildren()){
                           Log.d("List Exp","2 loop");
                               if(data.child("expensesName").exists()){
                                   Log.d("List Exp","if loop");
                                   Toast.makeText(getContext(), "exist", Toast.LENGTH_SHORT).show();
                               }else
                               {
                                   Log.d("List Exp","else loop");
                                   Toast.makeText(getContext(), "not exist", Toast.LENGTH_SHORT).show();
                               }
                           }
                       }
                   }


               @Override
               public void onCancelled(@NonNull DatabaseError databaseError) {

               }
           });

Я не знаю, где я ошибаюсь, и он отображает Not Exist Toast всегда, но база данных имеет это значение

Согласно PradyumanDixit Ответ Я обновил код, но он все еще не работает

//Here monthyr is the November_2018
          expensesaddref = databaseReference.child(username).child("Expense_Month").child(monthyr);
expensesaddref.orderByChild("expensesName").equalTo("oil").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                if(dataSnapshot.exists()){
                    Toast.makeText(getContext(), "Exist", Toast.LENGTH_SHORT).show();

                }else
                    Toast.makeText(getContext(), "not", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

Ответы [ 4 ]

0 голосов
/ 06 ноября 2018

Спасибо за ваш ответ Алекс, Адиль, Прадьюман . Как вы все предложили, я реструктурировал свой запрос, как упомянуто Адиль , и я могу запросить все свои данные по мере необходимости. моя структура

Expense_Month
   |
   --- November_2018
          |
          --- uniqueKey
          |     |
          |     --- expensesName: "gross"
          |     |
          |     --- total: 66
          |     |
          |     --- date_exp: "3_gross"
          |     |
          |     --- current_date: 3

          |
          --- uniquekey
                |
                --- expensesName: "oil"
                |
                --- total: 33
                |
                --- date_exp: "4_oil"
                |
                --- curent_date: 4
0 голосов
/ 05 ноября 2018

Чтобы решить эту проблему, я рекомендую немного изменить структуру базы данных. Поскольку в запросе нельзя использовать динамические значения или подстановочные знаки, схема базы данных должна выглядеть следующим образом:

Expense_monts
   |
   --- November_2018
          |
          --- -LQ ... Gb
          |     |
          |     --- expensesName: "gross"
          |     |
          |     --- total: 66
          |     |
          |     --- day: "Monday"
          |
          --- -LQ ... LO
                |
                --- expensesName: "oil"
                |
                --- total: 33
                |
                --- day: "Tuesday"

Как видите, нет необходимости использовать этого дополнительного ребенка (3, 4 и т. Д.). В этом случае запрос выглядит так:

expensesaddref = databaseReference.child(username).child("Expense_Month").child(monthyr);
expensesaddref.orderByChild("expensesName").equalTo("oil")
    .addListenerForSingleValueEvent(/* ... */);

Будет отлично работать.

0 голосов
/ 05 ноября 2018

Как сказал AlexMamo , вам необходимо реструктурировать базу данных, то есть выровнять иерархию двух уровней только до одного уровня. Как показано ниже:

Expense_Month
   |
   --- November_2018
          |
          --- 3_-LQ ... Gb
          |     |
          |     --- expensesName: "gross"
          |     |
          |     --- total: 66
          |     |
          |     --- day: "Monday"
          |     |
          |     --- day: 3
          |
          --- 4_-LQ ... LO
                |
                --- expensesName: "oil"
                |
                --- total: 33
                |
                --- day: "Tuesday"
                |
                --- day: 4

Обратите внимание, что каждый узел в November_2018 организован по ключу, сформированному из day , за которым следует push Id , разделенный подчеркиванием . т.е. " day_pushId ". Вы также можете добавить дополнительное поле для день (требуется запрос на конкретный день). Тогда запрос может быть сформирован так же, как и для «costName»:

//Here monthyr is the November_2018
          expensesaddref = databaseReference.child(username).child("Expense_Month").child(monthyr);
expensesaddref.orderByChild("expensesName").equalTo("oil").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                if(dataSnapshot.getChildrenCount() > 0){
                    Toast.makeText(getContext(), "Exist", Toast.LENGTH_SHORT).show();

                }else
                    Toast.makeText(getContext(), "not", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
0 голосов
/ 05 ноября 2018

Вы можете использовать код, подобный этому, с orderByChild() и equalTo(), чтобы сравнить все поля с expensesName с определенным значением, скажем «нефть», и узнать, существует ли такое поле или нет.

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Expenses Details").child(uniqueID).child("Expense_Month").child("November_2018");

ref.orderByChild("expensesName").equalTo("oil").addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                            if(dataSnapshot.exists()){
                              // do what you want here

                            }

                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) { // ToDo: do something about exceptions too

                        }
                  )};

Здесь uniqueID - это строка, которую я вижу в образе вашей базы данных между соответствующими узлами.

Edit:

После минутного изучения конструкции я думаю, что нашел проблему. Это не работает, потому что у вас есть узлы внутри November_2018, а именно 3, 4 и т. Д., Над узлом uniqueID, который находится выше expensesName.

Эта иерархия является причиной проблемы, я бы посоветовал вам сохранить счетчик внутри uniqeID, а не над ним, это заставит orderByChild() работать.

Как обычно с базами данных NoSQL: если вы не можете выполнить нужный вариант использования с текущей структурой данных, вы можете изменить или расширить структуру данных, чтобы разрешить вариант использования.

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

Ваша база данных с датами может выглядеть так:

-UniqueId
|
 -- expensesName
 -- date
 -- total
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...