android - 从 Firebase Realtime 获取特定值并收集它们的值
问题描述
如何从 Firebase Realtime 获取特定值并收集所有这些值以向用户显示销售列表 android studio 中所有子项的总价值 - 使用 java
从 Firebase Realtime 获取特定值并收集它们的值 android studio - 使用 java
public class SalesFragment extends Fragment {
TextView otherSalesValue, otherEarnsValue;
DatabaseReference databaseReference;
int sale;
String currentUserId;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_sales, container, false);
currentUserId = FirebaseAuth.getInstance().getCurrentUser().getUid();
databaseReference = FirebaseDatabase.getInstance().getReference("sales");
otherSalesValue = root.findViewById(R.id.other_sales_value);
otherEarnsValue = root.findViewById(R.id.other_earns_value);
databaseReference.child(currentUserId)
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot uniqueKeySnapshot : dataSnapshot.getChildren()) {
for (DataSnapshot booksSnapshot : uniqueKeySnapshot.child("total").getChildren()) {
String sales = booksSnapshot.getValue(String.class);
try {
sale = Integer.parseInt(sales);
} catch (NumberFormatException ex) {
ex.printStackTrace();
}
sale = +sale;
otherEarnsValue.setText(String.valueOf(sale));
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return root;
}
}
解决方案
您读取的sales
节点在其下有两个动态子级别,因此您需要两个嵌套循环getChildren()
才能获取该total
属性。
databaseReference.child(currentUserId)
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
for (DataSnapshot dateSnapshot : userSnapshot.getChildren()) {
// loop over all child nodes
long totalValue = dateSnapshot.child("total").getValue(Long.class);
// get the total for this date
sale = sale + totalValue; // add the daily total to the sum
}
}
otherEarnsValue.setText(String.valueOf(sale));
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}
});
请注意,如果您只需要每日总数的总和,那么读取每个客户端中的所有附加数据是非常浪费的。
考虑将运行总计存储在数据库的更高级别节点中(可能在 中/sales_total
),并在您还更新每日总计时更新该节点。像这样将数据保存在多个位置在 NoSQL 数据库中很常见,这也是它们的读取操作规模如此之大的部分原因。
推荐阅读
- c# - .net core 2.2 windows服务完全启动后如何配置托管服务?
- ruby-on-rails - 在使用 minitest 在 ruby 中测试模型时,我在 def setup 中保存数据,我得到了这条线的含义
- plotly - 绘制 groupby 变换
- math - 计算机如何计算负(-)和正(+)无穷大?
- java - 如何在java中从double转换为大于long的值
- angular - 错误 TS1127:在 Angular 7 中运行 Karma 测试时出现无效字符
- keras - 使用 ImageGenerator 时可以禁用图像大小调整吗?
- matlab - 定点迭代法错误MATLAB
- python - 根据 python pandas 数据框中其他列的值计算新列
- pyqt5 - 如何在pyqt5中区分背景和前景