java - firebase 中的数据更改是从第二个按钮单击发生的,第一次单击不执行任何操作

标签 java android firebase firebase-realtime-database

当我第一次单击按钮时,Firebase 中的数据不会更新,从第二次单击开始,只有数据会更新。 标志作为全局变量设置为 false

private void incrementDay(){
        db_total = FirebaseDatabase.getInstance().getReference("Total Days");
        db_total.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                try {
                    getTotal =  (long)dataSnapshot.getValue();
                    setTotal=getTotal+1;
                    flag=true;
                }catch( NullPointerException ne){
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });
        if(flag){
            db_total.setValue(setTotal);
            Snackbar.make(findViewById(android.R.id.content),"Days updated",Snackbar.LENGTH_SHORT).show();
        }
    }

最佳答案

数据是从 Firebase 异步加载的。任何需要数据的代码都需要位于加载数据时调用的onDataChange内部

所以类似:

private void incrementDay(){
    db_total = FirebaseDatabase.getInstance().getReference("Total Days");
    db_total.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            getTotal =  (long)dataSnapshot.getValue();
            setTotal=getTotal+1;
            db_total.setValue(setTotal);
            Snackbar.make(findViewById(android.R.id.content),"Days updated",Snackbar.LENGTH_SHORT).show();

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException();
        }
    });
}

但请注意,您正在根据当前值更新数据库值。如果两个用户几乎同时执行此操作,则只有其中一个写入操作会写入数据库。这就是为什么您应该始终将此类更新放入 Firebase 事务中。

类似于:

db_total.runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(MutableData current) {
        long count = current.getValue(Long.class);
        mutableData.setValue(count + 1);
        return Transaction.success(mutableData);
    }

    @Override
    public void onComplete(DatabaseError databaseError, boolean b,
                           DataSnapshot dataSnapshot) {
        // Transaction completed
        Log.d(TAG, "updating count:" + databaseError);
    }
});

关于java - firebase 中的数据更改是从第二个按钮单击发生的,第一次单击不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52192413/

相关文章:

Java - 双重比较

android - 无法从 Android Studio 生成签名的 apk

java - 如何通过改造接收来自服务器的消息?

ios - firebase/存储/图像/ View

ios - 在 Firebase iOS SDK 中,每次删除子项时都会触发 .childAdded。我怎样才能阻止这个?

Android SDK 说我没有 JDK,不是吗?

java - 如何使用 Jython 将 .pyc 文件反编译为 .py

java - 将 byte 或 int 转换为 bitset

android - 使用处理程序在 Android MAUI 上设置开关的 TrackColor,切换开关时不会保持设置状态

flutter - 在 flutter firebase 中,我收到错误 : [cloud_firestore/permission-denied] The caller does not have permission to execute the specified operation