Как увеличить число в базе данных

1

Я редактировал код. Оно работает. Он увеличивает счетчик в firebase. Но есть одна проблема. Всякий раз, когда я перезапускаю приложение (после четкого недавнего приложения), приращение начинается. Он не продолжается с предыдущего номера.

открытый класс MainActivity расширяет AppCompatActivity {

Button bNext;
long count;

DatabaseReference mRootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference mCounterRef = mRootRef.child("counter");

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    bNext = (Button) findViewById(R.id.bNext);

    bNext.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mCounterRef.setValue(++count);
        }
    });

}
}

это моя база данных

  • 0
    Если приложение вылетает, добавьте logcat к вашему вопросу
  • 0
    apk можно построить. после установки и нажатия на кнопку (bNext) он вылетел.
Показать ещё 3 комментария
Теги:
firebase
firebase-database

1 ответ

3
Лучший ответ

Три вещи требуют фиксации:

  • count в вашей БД есть число и будет считаться как Long. Вы не можете напрямую использовать int. Вместо этого вы можете использовать Long, или вы можете использовать две приведения: int count = (int)(long) ...
  • Вы используете оператор post-increment. Он добавляет один после использования значения. Вместо этого используйте pre-increment.
  • Прослушайте одно изменение, иначе вы будете зацикливаться, потому что setValue() снова вызовет прослушиватель для огня, и т.д.

Как отмечает Фрэнк, Transaction - лучший способ безопасного изменения счетчиков.

    final DatabaseReference mRootRef = FirebaseDatabase.getInstance().getReference();
    final DatabaseReference mCounterRef = mRootRef.child("counter");
    // listen for single change
    mCounterRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // getValue() returns Long
            long count = (long) dataSnapshot.child("count").getValue();

            System.out.println("count before setValue()=" + count);

            mCounterRef.child("count").setValue(++count);  // <= Change to ++count

            System.out.println("count after setValue()=" + count);

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            // throw an error if setValue() is rejected
            throw databaseError.toException();
        }
    });

Обновление для редактируемого вопроса:

Вероятно, вам необходимо обновить свои правила безопасности, чтобы разрешить доступ на запись. Добавьте слушателя завершения, чтобы узнать, не сработает ли setValue():

mCounterRef.child("count").setValue(++count, new DatabaseReference.CompletionListener() {
    @Override
    public void onComplete(DatabaseError databaseError,
                           DatabaseReference databaseReference) {
        if (databaseError != null) {
            System.out.println("Error: " + databaseError.getMessage());
        }
    }
});
  • 0
    привет, я редактировал вопрос но все же 1 проблема. приращение перезапускается при перезапуске приложения. любое предложение?
  • 0
    Я обновил свой ответ. Я могу только догадываться, в чем проблема. Когда вам нужна помощь в случае сбоя, важно включить в ваш пост вывод logcat или, по крайней мере, сообщение об исключении или ошибке, которое выводится при возникновении сбоя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню