print(notification.fireDate)
我遇到了种族问题,我不知道firebase是如何实现这种情况的。问题如下:
现在问题是2个或更多用户检查状态0并且都进入2点。这个问题可能毫无意义,但我需要确认一下。我不得不担心这个案子吗?
notification
答案 0 :(得分:3)
如果两个客户端恰好在同一时间通过setValue()
或updateChildren()
调用更新相同的值,则最后一次写入将获胜。
如果你不想那样,你应该是using a transaction。从该文件:
当处理可能被并发修改(例如增量计数器)损坏的复杂数据时,我们提供transaction operation。您为此操作提供了两个参数:更新函数和可选的完成回调。 update函数将数据的当前状态作为参数,并返回您想要写入的新的所需状态。例如,如果我们想增加特定博客文章中的upvotes数量,我们会编写如下的交易:
Firebase upvotesRef = new Firebase("https://docs-examples.firebaseio.com/android/saving-data/fireblog/posts/-JRHTHaIs-jNPLXOQivY/upvotes");
upvotesRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData currentData) {
if(currentData.getValue() == null) {
currentData.setValue(1);
} else {
currentData.setValue((Long) currentData.getValue() + 1);
}
return Transaction.success(currentData); //we can also abort by calling Transaction.abort()
}
@Override
public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) {
//This method will be called once with the results of the transaction.
}
});
答案 1 :(得分:0)
Firebase ref=firebase.child("order_details/"+orderId);
ref.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData currentData) {
Log.d("status",currentData.getValue());
int status= (int) currentData.child("status").getValue();
if(status==0){
HashMap<String,Object> map=new HashMap<String, Object>();
map.put("TokenId",sharedPreferences.getString("tokenId",""));
map.put("status",1);
currentData.setValue(map);
}
((MapLoadingActivity)getActivity()).setProgressVisibility(false);
return Transaction.success(currentData);
}
@Override
public void onComplete(FirebaseError firebaseError, boolean b, DataSnapshot dataSnapshot) {
}
});
我知道它迟到了问这个问题,但是doTransaction()很奇怪有时它会调用它有时它只返回null。因此我通过使用php包装类调用firebase将我的方法切换到php。如果我的方法,请建议是错的。