【问题标题】:ValueEventListener() is not reading data before data is updatedValueEventListener() 在数据更新之前没有读取数据
【发布时间】:2017-03-09 00:23:03
【问题描述】:

我正在构建一个 android 应用程序并使用 firebase 来存储数据。我的应用程序有“课程”和“测验”类。每当用户添加新测验时,我想增加课程对象中 quizCount 的值。 这就是它们在 Firebase 中的存储方式。

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

 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);

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

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    我不知道这是否是正确的方法,但我已经解决了。我仍在寻找更好的方法,但将我的答案发布给寻求快速修复的人。 这是我为增加数据库中的值所做的。我最初把

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

    在我的 ValueEventListener() 中,但这带来了 quizCount 的急剧增加,值超过了 100。 现在我声明了一个布尔变量 isIncremented,其余部分在代码中解释。

    // 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);
    
            }
            }
    

    这对我有用。

    【讨论】:

      猜你喜欢
      • 2022-12-03
      • 1970-01-01
      • 2017-10-13
      • 2020-10-25
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      相关资源
      最近更新 更多