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"); } });
Show Conversion Code Hide Conversion Code Show Emoticon Hide Emoticon