2016-02-26 140 views
1
-uniqueid1 
     status:0 
     userTokenId: uniqueid(which is null) 

我遇到了種族問題,我不知道firebase是如何實施這種情況的。該問題如下:圍繞特定情況下的火情況競賽火力堡

  1. 用戶檢查狀態爲狀態是否爲0。
  2. 如果狀態爲0它增加了它的令牌來userTokenid字段和狀態1
  3. 如果不是那麼它一點兒也不添加它的tokenid。

現在的問題是,當2個或更多的用戶檢查狀態0和兩個輸入2點。這個問題可能毫無意義,但我需要確認。我必須擔心這種情況嗎?

firebase.child('uniqueid1'); 

firebase.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     if(datasnapshot.child('status').getValue().equals(0)){ 
      //update record for userTokenId and status 
     } 
     else{ 
      //don't update 
     } 
    } 

    @Override 
    public void onCancelled(FirebaseError firebaseError) { 
    } 
}); 

回答

3

如果這兩個客戶端發生了setValue()updateChildren()呼叫,最後寫勝更新大約在同一時間相同的值。

如果你不想那樣,你應該可以是using a transaction。從文檔:

在處理複雜數據,可以通過併發修改,如增量計數器被破壞工作,我們提供了一個transaction operation。您給這個操作兩個參數:一個更新函數和一個可選的完成回調。更新函數將數據的當前狀態作爲參數,並將返回您想要編寫的新的期望狀態。例如,如果我們想要增加在一個特定的博客文章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()的全部細節。

+0

謝謝,你讓我的一天.. :) –

+1

在這種情況下,我強烈建議你閱讀[適用於Android的Firebase編程指南](https://www.firebase.com/docs/android/guide/)因爲這是我從中複製的。在那裏度過的一個小時,將防止許多錯誤和問題。 –

+0

,請檢查我的答案..提前致謝 –

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.Therefore我換我的方法,通過使用PHP的包裝class.Please確實表明呼叫火力點到PHP ,如果我的方法是錯誤的。