Firebase de Çevrimdışı İşlemler


         Disk Persistence (Diskte kalıcılık,süreklilik)

                  
Firebase uygulamaları geçici ağ kesintilerini otomatik olarak halleder. Önbellekte saklanan veriler çevrimdışıyken kullanılabilir ve Firebase, ağ bağlantısı yeniden kurulduğunda tüm yazışmaları tekrar gönderir.
         Disk kalıcılığını etkinleştirdiğinizde, uygulamanız veriyi yerel olarak cihaza yazar böylece kullanıcı veya işletim sistemi uygulamayı yeniden başlatsa bile uygulamanız çevrimdışı durumdayken durumu koruyabilir.
Disk kalıcılığını yalnızca bir kod satırı ile etkinleştirebilirsiniz.
FirebaseDatabase.getInstance().setPersistenceEnabled(true);


 Persistence Behavior(Kalıcı Davranış)


Sürekliliği etkinleştirerek, kullanıcı veya işletim sistemi uygulamayı yeniden başlattığında bile çevrimiçi ortam çevrimdışıyken Firebase Realtime Database istemcisi eşitlenir ve çevrimdışı olarak kullanılabilir. Bu, uygulamanızın, önbellekte depolanan yerel verileri kullanarak çevrimiçi olduğu gibi çalıştığı anlamına gelir. Dinleyicilerin geri çağrıları yerel güncellemeler için tetiklemeye devam edecektir.
            Firebase Realtime Database istemcisi, uygulamanız çevrimdışı iken gerçekleştirilen tüm yazma işlemlerinin sırasını otomatik olarak tutar. Kalıcılık etkinleştirildiğinde, kullanıcı veya işletim sistemi uygulamayı yeniden başlattığında tüm yazmalarınızın kullanılabilir olması için bu sıra da diske kalır. Uygulama bağlantıyı kurduğunda, tüm işlemler Firebase Realtime Database sunucusuna gönderilir.
            Uygulamanız Firebase Authentication (Kimlik Doğrulama) kullanıyorsa, Firebase Realtime Database istemcisi uygulamanın yeniden başlatılmasına kadar kullanıcının kimlik doğrulama işaretini devam ettirir. Uygulamanız çevrimdışı durumdayken doğrulama izni süresi dolarsa, uygulamanız kullanıcıyı yeniden kimlik doğrulaması yapana kadar istemci yazma işlemlerini duraklatır; aksi halde yazma işlemleri güvenlik kuralları nedeniyle başarısız olabilir.

Keeping Data Fresh(Yenilenen verilerin Saklanması)

Firebase Realtime Database, aktif dinleyiciler için verilerin yerel bir kopyasını senkronize eder ve saklar. Buna ek olarak, belirli konumları senkronize edebilirsiniz.
DatabaseReference scoresRef = FirebaseDatabase.getInstance().getReference("scores");

scoresRef.keepSynced(true);
Firebase Realtime Database istemcisi verileri bu konumlarda otomatik olarak indirir ve referansın hiç aktif dinleyicisi olsa bile senkronize tutar. Aşağıdaki kod satırıyla senkronizasyonu tekrar kapatabilirsiniz.
scoresRef.keepSynced(false);
Varsayılan olarak, 10MB daha önce senkronize edilen veriler önbelleğe alınır. Çoğu uygulama için bu yeterli olmalıdır. Önbellek yapılandırılmış boyutundan daha fazla artıyorsa, Firebase Realtime Database az önce kullanılan verileri temizler. Senkronize edilen veriler önbelleğinden temizlenmez.

Çevrimdışı Veri Sorgulama(Querying Data Offline)
Firebase Realtime Database, çevrimdışı olduğunda kullanmak üzere bir sorgudan döndürülen verileri saklar. Çevrimdışıyken yapılan sorgular için, Firebase Realtime Database önceden yüklenmiş veriler için çalışmaya devam eder. İstenen veri yüklenmemişse, Firebase Realtime Database yerel önbellekten veri yükler. Ağ bağlantısı yeniden kullanılabilir olduğunda, veriler yüklenir ve sorguyu yansıtır.

         Örneğin, bu kod, puanların bir Firebase Gerçek Zamanlı Veritabanı'ndaki son dört öğeye sorgular.
DatabaseReference scoresRef = FirebaseDatabase.getInstance().getReference("scores");

scoresRef.orderByValue().limitToLast(4).addChildEventListener(new ChildEventListener() {

    @Override

    public void onChildAdded(DataSnapshot snapshot, String previousChild) {

      System.out.println("The " + snapshot.getKey() + " dinosaur's score is " + snapshot.getValue());

    }

});


Kullanıcının bağlantısını kaybettiğini, çevrimdışı olduğunu ve uygulamayı yeniden başlattığını varsayalım. Hala çevrimdışı iken, uygulama aynı konumdaki son iki öğeyi sorgular. Uygulama, sorgudaki dört öğenin tümünü yüklediğinden, bu sorgu başarıyla son iki maddeyi döndürür.
scoresRef.orderByValue().limitToLast(2).addChildEventListener(new ChildEventListener() {

    @Override

    public void onChildAdded(DataSnapshot snapshot, String previousChild) {

        System.out.println("The " + snapshot.getKey() + " dinosaur's score is " + snapshot.getValue());

      }

});








İşlemleri Çevrimdışı Çalıştırma(Handling Transactions Offline)

Uygulama çevrimdışı iken gerçekleştirilen tüm işlemler sıraya girer. Uygulama ağa yeniden bağlanmaya başladığında, işlemler Realtime Database sunucusuna gönderilir.
         DİKKAT:İşlemler uygulama yeniden başlatmalarında kalıcı değil Kalıcılık etkin olsa bile, uygulamalar yeniden başlatıldığında işlemler devam etmez. Dolayısıyla, çevrimdışı yapılan işlemlere, Firebase Realtime Database'e bağlı olmaktan güvenemezsiniz. En iyi kullanıcı deneyimini sağlamak için, uygulamanız bir işlemin Firebase Realtime Database'inize henüz kaydedilmediğini göstermeli veya uygulamanın bunları manuel olarak hatırladığından ve bir uygulamanın yeniden başlatılmasından sonra tekrar çalıştırıldığından emin olmalıdır.

Firebase Realtime Database, çevrimdışı senaryolar ve ağ bağlantısıyla uğraşmak için bir çok özelliğe sahiptir. Bu kılavuzun geri kalan kısmı, kalıcınızın etkinleştirilip etkinleştirilmediği konusunda uygulamanız için geçerlidir.

Managing Presence(Durum yönetimi)

Gerçek zamanlı uygulamalarda, istemcilerin bağlanma ve bağlantı kesme zamanlarını tespit etmek genellikle yararlıdır. Örneğin, müşterinin bağlantısını kestiğinde bir kullanıcıyı 'çevrimdışı' olarak işaretlemek isteyebilirsiniz.

aşağıda, onDisconnect metodunu kullanarak bağlantıyı kesilme üzerine veri yazmak için basit bir örnek verilmiştir:

DatabaseRef presenceRef = FirebaseDatabase.getInstance().getReference("disconnectmessage");

// Write a string when this client loses connection

presenceRef.onDisconnect().setValue("I disconnected!");

How onDisconnect Works(OnDisconnect nasıl çalışır?)

Bir onDisconnect () işlemi kurduğunuzda, işlem Firebase Realtime Database sunucusunda yaşıyor. Sunucu, kullanıcının istenen yazma olayını gerçekleştirebildiğinden emin olmak için güvenliği denetler ve uygulamanızın geçersiz olup olmadığını bildirir. Sunucu bağlantıyı izler. Bağlantı herhangi bir noktada zaman aşımına uğradı veya Realtime Database istemcisi tarafından etkin bir şekilde kapatıldığında, sunucu, ikinci bir kez güvenliği kontrol eder (işlemi hala geçerli olduğundan emin olmak için) ve daha sonra olayın çağrısını yapar.

Bağlantı Durumunu Algılama(Detecting Connection State)

Varlık ile ilgili birçok özellik için, uygulamanızın ne zaman çevrimiçi veya çevrimdışı olduğunu bilmeleri yararlıdır. Firebase Realtime Database, Firebase Realtime Database istemcisinin bağlantı durumunun her değiştiğinde güncellenen /.info/connected adresinde özel bir konum sağlar. İşte bir örnek:

DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");

connectedRef.addValueEventListener(new ValueEventListener() {

  @Override

  public void onDataChange(DataSnapshot snapshot) {

    boolean connected = snapshot.getValue(Boolean.class);

    if (connected) {

      System.out.println("connected");

    } else {

      System.out.println("not connected");

    }

  }



  @Override

  public void onCancelled(DatabaseError error) {

    System.err.println("Listener was cancelled");

  }

});

/.info/connected,  boolean değeri istemcinin durumuna bağlı olduğu için Realtime Database istemcileri arasında senkronize edilmeyen bir boolean değeridir. Başka bir deyişle, bir istemci /.info/connected öğesini yanlış olarak okursa, bu, ayrı bir istemcinin de yanlış

Android'de, Firebase bant genişliğini ve pil kullanımını azaltmak için bağlantı durumunu otomatik olarak yönetir. Bir istemcide aktif bir dinleyici yoksa, bekleyen yazma ya da onDisconnect işlemi yoksa ve goOffline yöntemi tarafından açıkça kesilmemişse, Firebase 60 saniye boyunca işlem yapılmadığında bağlantıyı kapatır.

        Server Timestamps(Sunucu Zaman bilgisi)

Firebase Realtime Database sunucuları, sunucuda oluşturulan zaman bilgisini  veri olarak eklemek için bir mekanizma sağlar. Bu özellik, onDisconnect ile birlikte, bir Realtime Database istemcisinin bağlantısının kesildiği zamanı güvenilir bir şekilde not etmek için kolay bir yol sağlar.

DatabaseReference userLastOnlineRef = FirebaseDatabse.getInstance().getReference("users/joe/lastOnline");

userLastOnlineRef.onDisconnect().setValue(ServerValue.TIMESTAMP);

 

 

               Örnek uygulama

Bağlantı kesme işlemlerini bağlantı durumu izleme ve sunucu zaman damgaları ile birleştirerek bir kullanıcı durum sistemi oluşturabilirsiniz. Bu sistemde her kullanıcı, bir Realtime Database istemcisinin çevrimiçi olup olmadığını belirlemek için verileri bir veritabanı konumuna depolar. Müşteriler, çevrimiçi olduklarında bu konumu true ve bağlantı kesildikleri zaman damgasını belirler. Bu zaman damgası, verilen kullanıcının son çevrimiçi saatini gösterir. Her iki komut da sunucuya gönderilebilmek için önce istemcinin ağ bağlantısının kaybolması durumunda herhangi bir yarış koşulundan kaçınmak için uygulamanızın çevrimiçi olarak işaretlenmeden önce bağlantı kesme işlemlerini sıraya koyması gerektiğini unutmayın.

İşte bu senaryoya göre basit bir uygulama.



// Birden çok cihazdan bağlanabileceğimden, her bir bağlantı örneğini ayrı ayrı saklar

// ConnectionsRef'in değeri null olduğunda (yani hiç çocuk sahibi olmadığında) her zaman çevrimdışıyım

final FirebaseDatabase database = FirebaseDatabase.getInstance();

final DatabaseReference myConnectionsRef = database.getReference("users/joe/connections");



// Son bağlantımzımın zaman damgasını saklar (çevrimiçi gördüğüm son saati)

final DatabaseReference lastOnlineRef = database.getReference("/users/joe/lastOnline");



final DatabaseReference connectedRef = database.getReference(".info/connected");

connectedRef.addValueEventListener(new ValueEventListener() {

  @Override

  public void onDataChange(DataSnapshot snapshot) {

    boolean connected = snapshot.getValue(Boolean.class);

    if (connected) {

      // Bu cihazı bağlantı listesine ekler.

      // Bu değer cihazla ilgili bilgileri veya bir zaman damgasını da içerebilir
      DatabaseReference con = myConnectionsRef.push();

      con.setValue(Boolean.TRUE);



      // bağlantı kesildiğinde siler onu.

      con.onDisconnect().removeValue();



      // bağlantı kesildiğinde cevrim içi görünen en son saate güncellenir.

      lastOnlineRef.onDisconnect().setValue(ServerValue.TIMESTAMP);

    }

  }



  @Override

  public void onCancelled(DatabaseError error) {

    System.err.println("Listener was cancelled at .info/connected");

  }

});

 

 




sonraki
« Prev Post
Önceki
Next Post »
Thanks for your comment