围绕特定情况火基的情况进行比赛

时间:2016-02-26 06:35:41

标签: android firebase firebase-realtime-database

print(notification.fireDate)

我遇到了种族问题,我不知道firebase是如何实现这种情况的。问题如下:

  1. 用户检查状态是否为0的状态。
  2. 如果status为0,则将其标记添加到userTokenid字段和状态1
  3. 如果没有,则它不会添加其标记。
  4. 现在问题是2个或更多用户检查状态0并且都进入2点。这个问题可能毫无意义,但我需要确认一下。我不得不担心这个案子吗?

    notification

2 个答案:

答案 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.
    }
});

阅读documentation on 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。如果我的方法,请建议是错的。