Java 如何防止覆盖Firebase中的现有数据
我正在尝试制作一个食品订购应用程序,我正在使用Android Studio和Firebase获取数据,我是Firebase实时数据库的新手,当我想向购物车添加一个项目时,我遇到了一个小问题,应该有tableNumber、Menuame、menudType(我的意思是我的食物或饮料)、数量,并且应该减少库存(我通过menuName简化了清单命名)Java 如何防止覆盖Firebase中的现有数据,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在尝试制作一个食品订购应用程序,我正在使用Android Studio和Firebase获取数据,我是Firebase实时数据库的新手,当我想向购物车添加一个项目时,我遇到了一个小问题,应该有tableNumber、Menuame、menudType(我的意思是我的食物或饮料)、数量,并且应该减少库存(我通过menuName简化了清单命名) 每次我将购物车保存到Firebase时,tableNmber数据都不会保存 我无法在同一购物车上添加新项目,每次我添加新项目时,购物车都会刷新,并且我以
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
db.addListenerForSingleValueEvent(new ValueEventListener() {
boolean invalid=false;
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for(DataSnapshot ds : snapshot.getChildren()) {
Stock st = ds.child(menuName).getValue(Stock.class);
for(final Stock s : stock) {
if(s.getStockName().equals(menuName)) {
int require = quantity;
if(require >= Integer.parseInt(st.getStockQuantity())){
invalid=true;
} else {
int sisa = Integer.parseInt(st.getStockQuantity()) - require;
String sisa1 = String.valueOf(sisa);
Log.e("stock", sisa1);
Stock stock1 = new Stock(st.getStockName(), String.valueOf(sisa));
db.child(st.getStockName()).setValue(stock1);
}
}
}
}
if(invalid==false){
writeNewEntry(tables, menuName, date, quantity);
startActivity(new Intent(ProductDetails.this, DineIn.class));
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
});
}
public void increaseQuantity(){
quantity = quantity + 1;
txtQuantity.setText("" + quantity);
}
public void decreaseQuantity(){
if(quantity < 1){
quantity = quantity - 1;
txtQuantity.setText("" + quantity);
}
}
private void writeNewEntry(String table, String name, String dates, int q){
Cart entry = new Cart(table, name, dates, q);
FirebaseDatabase.getInstance().getReference("Cart").child(table).setValue(entry);
}
btnAdd.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
db.addListenerForSingleValueEvent(新的ValueEventListener(){
布尔无效=假;
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
对于(DataSnapshot ds:snapshot.getChildren()){
Stock st=ds.child(menuName).getValue(Stock.class);
用于(最终库存s:库存){
如果(s.getStockName().equals(menuName)){
整数=数量;
if(require>=Integer.parseInt(st.getStockQuantity())){
无效=真;
}否则{
int sisa=Integer.parseInt(st.getStockQuantity())-require;
字符串sisa1=字符串.valueOf(sisa);
Log.e(“库存”,sisa1);
StockStock1=新股票(st.getStockName(),String.valueOf(sisa));
db.child(st.getStockName()).setValue(stock1);
}
}
}
}
if(无效==false){
writenewtry(表、菜单名、日期、数量);
startActivity(新意图(ProductDetails.this,DineIn.class));
}
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
}
});
}
公共无效增量数量(){
数量=数量+1;
txtQuantity.setText(“+数量);
}
公共空间减少数量(){
如果(数量<1){
数量=数量-1;
txtQuantity.setText(“+数量);
}
}
私有void writenewtry(字符串表、字符串名称、字符串日期、int q){
购物车条目=新购物车(表、名称、日期、q);
FirebaseDatabase.getInstance().getReference(“购物车”).child(表).setValue(条目);
}
根据您的问题:
我的问题是,为什么每次我想向购物车添加一个新项目时,它都会替换旧项目
发生这种情况是因为以下代码行:
FirebaseDatabase.getInstance().getReference("Cart").child(table).setValue(entry);
你写的是“入口”对象,总是指向完全相同的“表”位置。因为FialBaseRealTimes数据库中的每个节点都是一个映射,那么在每一个新的添加中,它都会重写旧的值。
FirebaseDatabase.getInstance().getReference("Cart")
.child(table)
.push()
.setValue(entry);
这意味着您将始终为每个节点生成一个新密钥。那么您的问题到底是什么?哦,对不起,我忘了写它,mg问题是为什么每次我想在购物车上添加一个新项目,它都会替换旧项目?如果我想在购物车上添加一个新项目,该如何处理?谢谢,所以当我想在购物车上获取所有项目时,我只是为了得到孩子这些应用程序会在购物车上显示我的所有项目?类似的,但你应该使用“getChildren()”方法循环查看结果。试试看,告诉我它是否有效。对不起,我迟了回复。好的,随时通知我。哦,好的,非常感谢