java - 在 Firebase 中检索和更新子数据
问题描述
我在从 Firebase 实时数据库中检索和更新值时遇到问题:
reff = FirebaseDatabase.getInstance().getReference("Items").child(a);
reff.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snap : dataSnapshot.getChildren()) {
Items items = dataSnapshot.getValue(Items.class);
Integer na = items.getItemQuantity();
if (na <= 0) {
Toast.makeText(CheckOut.this, "Out of Stock", Toast.LENGTH_LONG).show();
} else {
na--;
snap.child("itemQuantity").getRef().setValue(na);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
来自 if-else 的第 60 行错误日志。
解决方案
根据您的最后评论:
是的,a 是我将从条形码收到的条形码。单个孩子的 itemQuantity。
要获取itemQuantity
单个孩子的属性值,请使用以下代码行:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference barcodeRef = rootRef.child("Items").child("1234567781");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
long itemQuantity = dataSnapshot.child("itemQuantity").getValue(Long.class);
Log.d(TAG, String.valueOf(itemQuantity));
//Do what you need to do with itemQuantity
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
barcodeRef.addListenerForSingleValueEvent(valueEventListener);
logcat 中的结果将是:
14
您的代码中的问题是您在实际上不需要时dataSnapshot
使用方法循环对象。getChildren()
您应该只获得上述代码中的正确引用,并itemQuantity
根据需要简单地使用属性的值。
推荐阅读
- python - Beautifulsoup 无法提取所有 html
- firebase - 在 Flutter 中创建搜索栏而不不必要地调用 Cloud Firestore 的正确方法是什么?
- macos - 数学 Mac 安装
- reactjs - 如何显示活动指示器,直到从firestore中获取所有数据并使用redux在react native中显示
- c# - 将 ASP.Net Core 3.0 Web 应用程序路由到子域和子文件夹
- javascript - 无法让 registerProtocolHandler 在本地主机上工作
- python - 为什么 re.sub() 函数返回一个空字符串?
- ios - Swift 中 SKShapeNode 的浮点问题
- angularjs - 如何使用 $sce angularJS 1.6 清理未找到的 img
- c# - Rotativa ActionAsPdf 背景图片