Firebase不断更改值并添加新子项

时间:2018-01-10 22:03:39

标签: java android firebase firebase-realtime-database

我正在尝试从firebase数据库加载数据,然后我想向它添加更多数据,最后我希望它上传回来。但问题是当数据被上传回来时,它在更新数据后没有停止。它看起来像是在循环中并一次又一次地完成任务。

mTempDatabase.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if(dataSnapshot.hasChild(mAuth.getCurrentUser().getUid())){
                                final DatabaseReference newTemp = mTempDatabase.child(mAuth.getCurrentUser().getUid());
                                final long qntCount = (long) dataSnapshot.child(mAuth.getCurrentUser().getUid()).child("QuantityCount").getValue();
                                final long foodamount = (long) dataSnapshot.child(mAuth.getCurrentUser().getUid()).child("QuantityCount").getValue();
                                //final long countfood = (long) dataSnapshot.child(mAuth.getCurrentUser().getUid()).child("QuantityCount").getValue();
                                mDatabaseBestseller.addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot) {
                                        String foodname = (String) dataSnapshot.child(food_key).child("foodname").getValue();
                                        long foodprice = (long) dataSnapshot.child(food_key).child("foodprice").getValue();
                                        long mfoodprice = foodprice + foodamount;
                                        long mqntCOunt = qntCount +1;
                                        newTemp.child("QuantityCount").setValue(mqntCOunt);
                                        newTemp.child("FoodPrice1").setValue(mfoodprice);

                                    }

                                    @Override
                                    public void onCancelled(DatabaseError databaseError) {

                                    }
                                });

                            }

                        }


                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });
                    mTempDatabase.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if(!dataSnapshot.hasChild(mAuth.getCurrentUser().getUid())) {
                                final DatabaseReference newTemp = mTempDatabase.child(mAuth.getCurrentUser().getUid());
                                mDatabaseBestseller.addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot) {
                                        String foodname = (String) dataSnapshot.child(food_key).child("foodname").getValue();
                                        long foodprice = (long) dataSnapshot.child(food_key).child("foodprice").getValue();

                                        newTemp.child("QuantityCount").setValue(1);
                                        newTemp.child("CountFood1").setValue(1);
                                        newTemp.child("Food1").setValue(foodname);
                                        newTemp.child("FoodPrice1").setValue(foodprice);
                                    }

                                    @Override
                                    public void onCancelled(DatabaseError databaseError) {

                                    }
                                });
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });
                    viewHolder.mFoodAddLayout.setVisibility(View.INVISIBLE);
                    viewHolder.mIncrLayout.setVisibility(View.VISIBLE);

                }
            });

根据我的理解,我在检索数据和添加数据时做了错误的数学运算。

2 个答案:

答案 0 :(得分:1)

addValueEventListener()将始终监听数据库引用值更改。如果要停止侦听,则必须使用removeEventListener(valueListener), 但addListenerForSingleValueEvent()立即执行onDataChange方法,并且在执行该方法一次后,它会停止侦听值更改。

答案 1 :(得分:0)

您需要使用.addListenerForSingleValueEvent()代替.addValueEventListener()。区别在于,每次在数据库中更改值时,第二个都会不断更新,这会在您更新函数内的值时继续发生。但是,我建议的第一种方法,只需读取一次值,这就是你需要的。