2016-08-01 15 views
7

Sadece Firebase ve veritabanları ile çalışmaya başladım, bu yüzden lütfen bu sorunun çözümünde basit bir çözüm varsa lütfen beni affedin.Firebase - Birden çok kullanıcı aynı değeri eski değeriyle aynı anda güncelliyor

Kullanıcıların bir Android uygulaması aracılığıyla Firebase veritabanında güncelleştirdiği bir sayımı takip ediyorum. Şu anda çalıştığı şekilde, etkileşimli olarak kullanıcının uygulaması veritabanındaki geçerli sayıyı (yeni ValueEventListener içinde tanımlanan bir addListenerForSingleValueEvent() ve onDataChange() yöntemini kullanarak) arar ve ona bir tane ekler ve sonra bu sayıyı ayarlar. mRef.setValue() kullanarak mRef'in veritabanına referansı olduğu yeni değer.

Endişelendiğim sorun, çok sayıda kullanıcının aynı anda birlikte veritabanında etkileşime girmesi durumunda ne olacağı; Firebase, değerin okunduğundan ve doğru bir şekilde artırıldığından veya bununla ilgili olarak çok fazla çakışma ve potansiyel olarak veri kaybının olduğundan emin olmakla ilgilenir.

Yardım için zaman ayırdığınız için teşekkürler!

+0

Firebase'in bunu yaptığını sanmıyorum. Verileri sizin için kilitlemez. – Joshua

+3

[Firebase işlemleri] 'ne bir göz atın (https://www.firebase.com/docs/android/guide/saving-data.html#section-transactions) –

+0

@ AndréKool bunu biraz cevapla yazabilir misiniz örnek (muhtemelen bağlı olduğunuz dokümanlar)? Bu, sorunun düzgün bir şekilde cevaplandığını göstermemize olanak tanır. –

cevap

10

Artımlı sayaçlar gibi eşzamanlı modifikasyonlarla bozulabilecek karmaşık verilerle çalışırken, Firebase bir işlem işlemi sağlar.

Bu işlemi iki bağımsız değişken verin: bir güncelleme işlevi ve isteğe bağlı bir tamamlama geri çağrısı. Güncelleme fonksiyonu, verilerin mevcut durumunu bir argüman olarak alır ve yazmak istediğiniz yeni istenen durumu döndürür. Biz belirli bir blog yayınında upvotes sayısını artırmak istiyorsa

Örneğin, aşağıdaki (Eski kod) gibi bir işlemi yazardı:

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

Legacy source

New firebase version source

+0

Cevap ve bağlantılar için teşekkürler! – Ron7

+0

Aynı anda güncellenmesi gereken birden fazla ayrı düğüm için 'runTransaction'ı nasıl kullanırsınız? Şu anda 'updateChildren'ı kullanıyorum ama bununla birlikte –

+0

eşzamanlılık sorunları olabileceğini düşünüyorum. Bu sorunu şu an günlerdir çalışıyorum. İyi bir şey bunu buldum. Teşekkür ederim! –

0

Firebase veritabanı, ücretsiz planınızı kullanıyorsa veritabanınıza 100 eş zamanlı gerçek zamanlı bağlantı kurar, ancak veritabanı kullanıcıları veritabanına bağlandığında veritabanına yanıt vermez ve en son düzenlenen değerleri görüntüler. Firebase gerçek zamanlı bağlantıların eşzamanlı olarak kullanılmasında gerçekten iyidir, bu nedenle fiyatlandırma planlarınıza bağlıdır. Veritabanını ücretsiz kullanmak istiyorsanız, 100 bağlantıyı ele alan hiçbir sorun olmayacaktır, ancak daha fazla kullanıcıyla çalışmak istiyorsanız, cömert fiyatlandırma planlarını kullanın.

İlgili konular