Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止覆盖Firebase中的现有数据_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 如何防止覆盖Firebase中的现有数据

Java 如何防止覆盖Firebase中的现有数据,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在尝试制作一个食品订购应用程序,我正在使用Android Studio和Firebase获取数据,我是Firebase实时数据库的新手,当我想向购物车添加一个项目时,我遇到了一个小问题,应该有tableNumber、Menuame、menudType(我的意思是我的食物或饮料)、数量,并且应该减少库存(我通过menuName简化了清单命名) 每次我将购物车保存到Firebase时,tableNmber数据都不会保存 我无法在同一购物车上添加新项目,每次我添加新项目时,购物车都会刷新,并且我以

我正在尝试制作一个食品订购应用程序,我正在使用Android Studio和Firebase获取数据,我是Firebase实时数据库的新手,当我想向购物车添加一个项目时,我遇到了一个小问题,应该有tableNumber、Menuame、menudType(我的意思是我的食物或饮料)、数量,并且应该减少库存(我通过menuName简化了清单命名)

  • 每次我将购物车保存到Firebase时,tableNmber数据都不会保存
  • 我无法在同一购物车上添加新项目,每次我添加新项目时,购物车都会刷新,并且我以前的项目会被新项目更新
  • 每次我向购物车添加新物品时,我的库存没有减少,而且数量仍然相同
  • 有人能帮我吗?非常感谢

    这里我附上我的Firebase数据截图。红色圆圈是我的问题,在1号,蓝色圆圈是3号

    这是我添加新购物车和减少库存的代码

    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()”方法循环查看结果。试试看,告诉我它是否有效。对不起,我迟了回复。好的,随时通知我。哦,好的,非常感谢