Я редактировал код. Оно работает. Он увеличивает счетчик в 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);
}
});
}
}
Три вещи требуют фиксации:
count
в вашей БД есть число и будет считаться как Long
. Вы не можете напрямую использовать int
. Вместо этого вы можете использовать Long
, или вы можете использовать две приведения: int count = (int)(long) ...
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());
}
}
});