Android:Firebase号码增量

时间:2016-08-04 19:18:26

标签: java android firebase firebase-realtime-database

我坚持使用Firebase在Java中创建一个值,而事实上它并没有更新全局变量。当我在onStart上调用EventListener时,它成功地显示了变量的正确值(60)。当我想将它增加10 - 点击一下按钮 - 它会显示0。

filter

单击按钮时,将调用以下函数

long value;

@Override
protected void onStart() {
    super.onStart();

    final TextView mValue = (TextView) findViewById(R.id.some_textview);

    mRef = new Firebase(some_correct_url);
    mRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            value = (long) dataSnapshot.getValue();
            mValue.setText(value+"");
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });
}

所以第一部分全部检索变量的正确值,但第二部分没有增加正确的值。提前谢谢!

编辑:顺便说一下,我将Firebase规则设置如下:

public void addTen(View view) {
    mRef = new Firebase(my_private_url);
    mRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            value =(long) dataSnapshot.getValue();
            value = value + 10;
        }
        @Override
        public void onCancelled(FirebaseError firebaseError) {
        }
    });

    mRef.setValue(value);

}

这是为了开发时间。

3 个答案:

答案 0 :(得分:4)

Firebase侦听器异步触发。在侦听器触发并更新mRef.setValue(value)之前,您对value的调用已执行。像这样更改你的代码:

public void addTen(View view) {
    mRef = new Firebase(my_private_url);
    mRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            value =(long) dataSnapshot.getValue();
            value = value + 10;
            dataSnapshot.getRef().setValue(value);
        }
        @Override
        public void onCancelled(FirebaseError firebaseError) {
        }
    });
}

请注意,addListenerForSingleValueEvent()已取代addValueEventListener()。每次addten()被调用时,我都不认为你想要堆积听众。

答案 1 :(得分:0)

在Firestore中,您可以使用以下方法增加值(可以减少方法)

void updateIMEICount(){
    progressDialog.setMessage(getString(R.string.verifying_imei_dialog_message));
    progressDialog.show();

    firebaseFirestore.collection(Constants.FB_IMEI_ROOT_PATH).document("IMEI").get()
            .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                    if (task.isSuccessful()) {
                        DocumentSnapshot documentSnapshot = task.getResult();
                        final IMEIModel imeiModel = documentSnapshot.toObject(IMEIModel.class);
                        Log.d(TAG, "documentSnapshot imeiModel : " + imeiModel.toString());
                        final IMEIModel imeiModelUpdate = new IMEIModel();
                        imeiModelUpdate.setIMEI(imeiModel.getIMEI()+1);
                        documentSnapshot.getReference().set(imeiModelUpdate).addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                progressDialog.dismiss();
                                Log.d(TAG,"imeiModelUpdate updated from : "+imeiModel.getIMEI());
                                Log.d(TAG,"imeiModelUpdate updated to : "+imeiModelUpdate.getIMEI());
                                launchHomeScreen();
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                progressDialog.dismiss();
                            }
                        });

                        progressDialog.dismiss();

                    } else {
                        utility.failureToast("getting call id failed .please try again");
                        progressDialog.dismiss();
                        Log.d(TAG, "getting getCallID failed");
                    }
                }
            });
}

答案 2 :(得分:0)

答案正确无误,但是如果两个用户在相同时间中执行相同的操作会怎样?

请参阅Save data as transactions in fire base

在处理可能被并发修改破坏的数据(例如增量计数器)时,可以使用事务操作。

例如,在示例性社交博客应用程序中,您可以允许用户为帖子加注星标和取消注星,并跟踪帖子获得了多少星标,如下所示:

private void onStarClicked(DatabaseReference postRef) {
    postRef.runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(MutableData mutableData) {
            Post p = mutableData.getValue(Post.class);
            if (p == null) {
                return Transaction.success(mutableData);
            }

            if (p.stars.containsKey(getUid())) {
                // Unstar the post and remove self from stars
                p.starCount = p.starCount - 1;
                p.stars.remove(getUid());
            } else {
                // Star the post and add self to stars
                p.starCount = p.starCount + 1;
                p.stars.put(getUid(), true);
            }

            // Set value and report transaction success
            mutableData.setValue(p);
            return Transaction.success(mutableData);
        }

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

两个用户同时进行修改会同时破坏您的方式