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

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(/* ... */);
将工作得很好。

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
添加回答
举报