这段代码运行正确。它将值增加1,但是当我重新启动应用程序或重新启动活动时,数据将被覆盖为1。
int regEvents = 0;
String events_registered = "0";
private void btnAddRegisteredEvents() {
final String key2 = FirebaseAuth.getInstance().getCurrentUser().getUid();
final DatabaseReference databaseReferenceObj2 = FirebaseDatabase.getInstance()
.getReference().child("Users")
.child(key2).child("eventsregistered");
databaseReferenceObj2.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
events_registered = dataSnapshot.getValue(String.class);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
regEvents = Integer.parseInt(events_registered) + 1;
databaseReferenceObj2.setValue(String.valueOf(regEvents));
}
答案 0 :(得分:1)
这是因为每次启动应用程序时,您都会使用值events_registered
初始化"0"
,然后立即将数据库中的值设置为events_registered+1
。您定义的事件监听器中包含的代码在此set操作之前不会执行,因为它是异步的。
要增加存储在数据库中的值,最好使用包含transaction operation的transaction handler。这是捆绑的读取-修改-更新操作,对于依赖于当前数据库值的任何操作(例如增量计数器)很有用。
private void btnAddRegisteredEvents() {
final String userId = FirebaseAuth.getInstance().getCurrentUser().getUid();
final DatabaseReference eventsRegisteredRef = FirebaseDatabase.getInstance()
.getReference().child("Users")
.child(userId).child("eventsregistered");
eventsRegisteredRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData mutableData) {
int eventsregistered = mutableData.getValue(Integer.class); // parses string as integer
eventsregistered++;
mutableData.setValue(eventsregistered);
return Transaction.success(mutableData); // return updated data to be written
}
@Override
public void onComplete(DatabaseError databaseError, boolean b,
DataSnapshot dataSnapshot) {
// Transaction completed
Log.d(TAG, "postTransaction:onComplete:" + databaseError);
}
});
}
答案 1 :(得分:0)
这是因为,当您开始活动时,您正在将events_registered变量值重新初始化为0,并且将其更新为该值。因此,在这里,您只需将最后增加的值保存在共享的首选项或数据库中。下次启动应用程序时。只需读取共享首选项值,然后将共享首选项值+1添加到您的值即可。这就解决了所有问题。现在,您将正确更新值。