2016-10-26 2 views
0

私はAndroidアプリケーションを構築しており、firebaseを使用してデータを格納しています。私のアプリには "Course"と "Quiz"というクラスがあります。ユーザーが新しいクイズを追加するたびに、コースオブジェクトのquizCountの値を増やしたいと思います。 これはfirebaseに格納される方法です。 enter image description hereValueEventListener()はデータが更新される前にデータを読み取っていません

これはデータベースに書き込むコードの一部です。

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の値が増分されていないことです。 クイズが追加された直後、最後のコード行でquizCountが更新された後(クイズカウント変数が最初は0に変更されてから1が増えてから常に1に更新された後)、トースト1とトースト3が表示されます。 ()は、データベース内のデータが変更されたときに呼び出されます。私はこれを必要としません。私はそれを増やすためにデータベースから価値を読みたいと思います。 私もAddListenerForSingleValueEvent()を試しましたが、Toast 1はまったく表示されませんでした。 quizCountの値を読み取ってデータベースを更新する方法を教えてください。 多くの感謝

答えて

0

私はこれが正しい方法であるかどうかわかりませんが、私は回避しました。私はまだ、より良い方法を探していますが、迅速な修正を探している人のために私の答えを投稿しています。 は、ここで私が最初に私のValueEventListener()内

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

を入れていたdatabase.Iの値をインクリメントするでしたが、それはquizCountで劇的な増加をもたらしたもので、値が百を越えました。 今、ブール変数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); 

     } 
     } 

これは私に役立ちました。

関連する問題