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

У меня возникла проблема гонки вокруг состояния, когда я не знаю, как эта битба реализует этот случай. Проблема заключается в следующем:Гонка вокруг условия для конкретного случая firebase

  1. пользователя статус проверяет, является ли для 0.
  2. состояние, если состояние 0, присоединяя свой маркер userTokenid поля и статус 1
  3. , если нет, то это does'nt добавить его токенид.

Теперь проблема заключается в том, что 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

В этом случае я настоятельно рекомендую вам прочитать [Руководство по программированию Firebase для Android] (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 с помощью вызова firebase с помощью PHP-оболочки class.Please действительно предполагают , если мой подход ошибочен.

Смежные вопросы