2016-10-26 5 views
0

Я создаю приложение для Android и использую firebase для хранения данных. В моем приложении есть классы «Курс» и «Викторина». Я хочу увеличить значение 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 не увеличивается. Тост 2 и Тост 3 появляются сразу после добавления викторины и после того, как quizCount обновляется в Firebase по последней строке кода (всегда обновляется до 1, так как переменная quizCount изначально равна 0, а затем 1 после приращения) появляется тост 1. Это означает, что ValueEventListener() вызывается при изменении данных в базе данных. Я не хочу этого. Я хочу прочитать значение из базы данных, чтобы увеличить его. Я также пробовал AddListenerForSingleValueEvent(), но затем Toast 1 вообще не отображался. Пожалуйста, скажите мне, как читать значение quizCount, чтобы я увеличил его и обновил его в базе данных. Большое спасибо

ответ

0

Я не знаю, правильно ли это, но я работал. Я все еще ищу лучший способ, но отправляю свой ответ для тех, кто ищет быстрое решение. Вот что я сделал, чтобы увеличить значение в database.I первоначально поставил

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

внутри моей ValueEventListener(), но это принесло резкий прирост в 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); 

     } 
     } 

Это сработало для меня.

Смежные вопросы