【发布时间】:2020-05-04 02:07:35
【问题描述】:
我正在尝试获取一些列表数据并放入列表中。但我做不到。我尝试了很多东西,但都没有奏效。
所以有一个主根是用户,然后是用户名,在这种情况下它是“mm”。该节点包括一些数据和一些其他节点。费用就是其中之一。在费用中有一些独特的键。每个唯一键都表示不同的收据。并且每个唯一的密钥存储这张收据的产品。在这种情况下,有三个 (0-1-2)。没有限制为三个。它可以是 3 或 1 或 15。每个节点都以“费用”类类型存储一个值。
我想把这些数据放到一个列表中。所以这个列表应该存储这样的数据。
{
{
Receipt1: {
amount: 1,
marketName: "aa",
price: 2,
productName: "bb"
},
{
amount: 2,
marketName: "cc",
price: 3,
productName: "dd"
}
}, {
Receipt2: {
{
amount: 3,
marketName: "ee",
price: 5,
productName: "ff"
},
{
amount: 1,
marketName: "gg",
price: 7,
productName: "jj"
},
{
amount: 9,
marketName: "nn",
price: 5,
productName: "vv"
}
}
}
所以我应该能够单独访问收据。如果我搜索 Receipt1,那么我应该得到 3 个节点,例如示例。
我尝试这样获取这些数据。但它不起作用。
private void receiptGetter(String userName,SimpleCallback<Boolean> finishedCallback) {
DatabaseReference rootRef = databaseManager.getReference();
DatabaseReference expensesRef = rootRef.child("user").child(userName).child("expenses");
Query queryReceiptFinder = expensesRef.orderByKey();
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
expenses = ds.getValue(Expenses.class);
expensesList.add(expenses);
}
finishedCallback.run(true);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d("error", databaseError.getMessage());
finishedCallback.run(false);
}
};
queryReceiptFinder.addListenerForSingleValueEvent(valueEventListener);
}
然后我尝试这样获取这些数据。
searchButton.setOnClickListener(v -> {
receiptGetter("userName", (success) -> {
if (success) {
String receipt = expensesList.toString();
receiptText.setText(receipt);
} else
Log.d("error", getString(R.string.ErrorOccured));
});
【问题讨论】:
-
您可以在您的案例中将快照读取为对象的 ArrayList
标签: java android database firebase firebase-realtime-database