ValueEventListener()在更新数据之前不读取数据

时间:2016-10-26 14:55:54

标签: android firebase firebase-realtime-database

我正在构建一个Android应用程序并使用firebase来存储数据。我的应用程序有课程"课程"和"测验"。我想在用户添加新测验时增加课程对象中quizCount的值。 这是它们存储在firebase中的方式。 enter image description here

这是我写入数据库的代码部分。

 toIncrementQuizCount = FirebaseDatabase.getInstance().getReference().child(Constants.FIREBASE_COURSES).child(userId).child(courseKey);
    toIncrementQuizCount.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        Course course     = dataSnapshot.getValue(Course.class);
                        if(course != null) {
                            // int quizCount is intially set to 0
                            quizCount = course.getQuizCount();
                            // Toast 1
                            Toast.makeText(getActivity(), "inside listener " + Integer.toString(quizCount), Toast.LENGTH_SHORT).show();

                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
            Quiz quiz = new Quiz(quizTitle, scheduledDate,marksPerQs,  0);
            mDatabase.child(Constants.FIREBASE_QUIZZES).child(courseKey).push().setValue(quiz);
            // Toast 2
            Toast.makeText(getActivity(), Integer.toString(quizCount), Toast.LENGTH_SHORT).show();

            quizCount = quizCount + 1;
            // Toast 3
            Toast.makeText(getActivity(),"after increment " + Integer.toString(quizCount), Toast.LENGTH_SHORT).show();

            mDatabase.child(Constants.FIREBASE_COURSES).child(userId).child(courseKey).child(Constants.FIREBASE_COURSES_QUIZCOUNT).setValue(quizCount);

现在的问题是测验成功存储在数据库中,但是quizCount的值没有增加。 添加测验后立即出现Toast 2和Toast 3,并且在Firebase中通过最后一行代码更新quizCount后(由于quizCount变量最初为0,然后在增量后为1,因此总是更新为1)然后出现Toast 1.这表示ValueEventListener( )在数据库中更改数据时调用。我不想要这个。我想从数据库读取值来增加它。 我也尝试过AddListenerForSingleValueEvent(),但Toast 1根本没有出现。 请告诉我如何读取quizCount的值,以便我增加它并在数据库中更新它。 非常感谢

1 个答案:

答案 0 :(得分:0)

我不知道这是不是正确的方法,但我一直在努力。我仍然在寻找一种更好的方法,但是为寻找快速解决方案的人发布我的答案。 这是我在数据库中增加值所做的。我最初放了

count = course.getQuizCount();
 count++;
                         mDatabase.child(Constants.FIREBASE_COURSES).child(userId).child(courseKey).child(Constants.FIREBASE_COURSES_QUIZCOUNT).setValue(count);

在我的ValueEventListener()中,但是在quizCount中带来了一个显着的增量,值超过了百。 现在我声明了一个布尔变量isIncremented,rest在代码中解释。

// this method is called when user clicks on "add" button to add quiz     
public void addQuiz() {
            isIncremented = false;
            final String userId = FirebaseAuth.getInstance().getCurrentUser().getUid();

        // some irrelevant code here
        else{
            toIncrementQuizCount.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    Course course     = dataSnapshot.getValue(Course.class);
                    if(course != null && isIncremented == false) {
                        count = course.getQuizCount();
                        count++;
                        mDatabase.child(Constants.FIREBASE_COURSES).child(userId).child(courseKey).child(Constants.FIREBASE_COURSES_QUIZCOUNT).setValue(count);
                   isIncremented = true;
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
            Quiz quiz = new Quiz(quizTitle, scheduledDate,marksPerQs,  0);
            mDatabase.child(Constants.FIREBASE_QUIZZES).child(courseKey).push().setValue(quiz);
            Toast.makeText(getActivity(), Integer.toString(count), Toast.LENGTH_SHORT).show();

            count = count + 1;
            Toast.makeText(getActivity(),"after increment " + Integer.toString(count), Toast.LENGTH_SHORT).show();

            mDatabase.child(Constants.FIREBASE_COURSES).child(userId).child(courseKey).child(Constants.FIREBASE_COURSES_QUIZCOUNT).setValue(count);

        }
        }

这对我有用。