猿问

查找子数据中的子项是否存在 Android Firebase

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

更新


我需要找到子费用名称(例如它可以是油)是否存在于 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 有那个价值

慕哥6287543
浏览 181回答 3
3回答

红颜莎娜

你可以使用这样的代码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是我可以在您的数据库图像中在相关节点之间看到的字符串。编辑:盯着结构看了一分钟,我想我已经找到了问题所在。这是行不通的,因为你有节点内November_2018,即3,4等等,这是上面的UNIQUEID节点之上expensesName。这种层次结构是导致问题的原因,我建议您将计数保存在 uniqeID 内而不是在它之上,这将orderByChild()起作用。与 NoSQL 数据库一样:如果您无法使用当前的数据结构执行您想要的用例,您通常可以更改/扩展您的数据结构以允许用例。通常这是通过非常直接地将您想要在屏幕上显示的内容映射到数据库中的结构来完成的。带有日期的数据库可能如下所示:-UniqueId| -- expensesName -- date -- total

红糖糍粑

为了解决这个问题,我建议你稍微改变你的数据库结构。由于无法在查询中使用动态值或通配符,因此您的数据库架构应如下所示: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(/* ... */);将工作得很好。

潇湘沐

感谢您对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
随时随地看视频慕课网APP

相关分类

Java
我要回答