我坚持使用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);
}
这是为了开发时间。
答案 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);
}
});
}
两个用户同时进行修改会同时破坏您的方式