为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2021-12-30 17:37:15
这可能是重复的问题,但我尝试了很多,但没有得到结果,这是我的 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 有那个价值
查看完整描述

3 回答

?
红颜莎娜

TA贡献1842条经验 获得超13个赞

你可以使用这样的代码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


查看完整回答
反对 回复 2021-12-30
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

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


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(/* ... */);

将工作得很好。


查看完整回答
反对 回复 2021-12-30
?
潇湘沐

TA贡献1816条经验 获得超6个赞

感谢您对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


查看完整回答
反对 回复 2021-12-30
  • 3 回答
  • 0 关注
  • 180 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号