查找子数据中是否存在子元素Android Firebase

时间:2018-11-05 10:42:27

标签: java android firebase firebase-realtime-database

这可能是重复的问题,但是我尝试了很多,但是没有得到结果,这是我的firebase结构

database

已更新

我需要确定子对象 expensesName (例如可能是 oil )是否存在于 2018年11月_的整个节点下 (在红色方框内)。如果存在,我需要展示烤面包

下面是我尝试过的代码:

//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 ,但是firebase拥有该值

根据 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 :(得分:0)

您可以对orderByChild()equalTo()使用类似的代码,将expensesName的所有字段与特定值(例如“ oil”)进行比较,并知道该字段是否存在。

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是我在您的数据库映像中可以看到的有关节点之间的字符串。

编辑:

凝视结构一分钟后,我认为我已找到问题所在。这是行不通的,因为您在November_2018内有节点,即34等,在expensesName上方的uniqueID节点上方。

此层次结构是导致此问题的原因,我建议您将计数保存在uniqeID内而不是在其上方,这将使orderByChild()起作用。

与NoSQL数据库一样:如果无法使用当前数据结构执行所需的用例,则通常可以更改/扩展数据结构以允许用例。

通常,这是通过非常直接地将要在屏幕上显示的内容映射到数据库中的结构来完成的。

具有日期的数据库如下:

-UniqueId
|
 -- expensesName
 -- date
 -- total

答案 1 :(得分:0)

为解决此问题,建议您稍微更改数据库结构。由于无法在查询中使用动态值或通配符,因此数据库架构应如下所示:

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

如您所见,不需要使用多余的子代(34等)。在这种情况下,查询如下:

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

可以很好地工作。

答案 2 :(得分:0)

正如 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

请注意, 2018年11月中的每个节点都是由 day 后面的 push ID 和下划线组成的键组成的>。 即“ day_pushId ”。您还可以添加的其他字段(以防特定日期查询)。然后可以按照与“ expensesName”类似的方式形成查询:

//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) {

            }
        });

答案 3 :(得分:0)

感谢您的所有答复 Alex,Aadil,Pradyuman 。正如大家都建议的那样,我已将我的查询重组为 Aadil ,我可以根据需要查询所有数据这是我的结构

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