在应用重启或活动重新打开时,Firebase Key的Child数据将被覆盖为一个

时间:2019-11-25 03:33:26

标签: android firebase firebase-realtime-database

这段代码运行正确。它将值增加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));


}

2 个答案:

答案 0 :(得分:1)

这是因为每次启动应用程序时,您都会使用值events_registered初始化"0",然后立即将数据库中的值设置为events_registered+1。您定义的事件监听器中包含的代码在此set操作之前不会执行,因为它是异步的。

要增加存储在数据库中的值,最好使用包含transaction operationtransaction 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添加到您的值即可。这就解决了所有问题。现在,您将正确更新值。