ÇEVİRİ : Android üzerinde Veri Kaydetme (Save Data on Android)

Firebase Gerçek Zamanlı Veri Tabanına (Firebase Realtime Database) veri yazmak için 4 adet metod mevcuttur.

MetodÖzellikliği

setValue()

"users/$user-id/$username" gibi tanımlanmış olan yola (path) veri yazmak yada değiştirmek.

push()

Veri listesine ekleme yapmak. push() metodu her çağrıldığında, Firebase farklı bir (unique) ID yaratır.. Örnegin; "user-posts/$user-id/$unique-post-id" gibi..

updateChildren()

Belirlenen bir path üzerindeki bazı verileri, tüm verileri değiştirmeye gerek kalmadan güncellemek.

runTransaction()

runTransaction() Eş zamanlı yapılan güncellemeler esnasında bozulabilecek olan daha büyük ve karmaşık verileri güncellemek

Not: Normalde, veri tabanında okuma ve yazma erişimi kısıtlıdır. Sadece bazı yetkilendirilmiş kullanıcılar okuma ve yazma işlemi yapabilir. Yetkilendirme (Authentication) ayarı yapmadan, kuralları (Rules) düzenleyerek veri tabanını herkesin erişimine açabilirsiniz. Eğer veri tabanınızın erişimini hiç kimseye açmazsanız, kullanıcılar uygulamalarınızı kullanamaz. Bu yüzden, yetkilendirme ayarı yaparken veri tabanı erişimini sınırlandırdığınıza emin olun.

DatabaseReference Almak (Get a DatabaseReference)


Veri tabanına veri yazabilmek için bir DatabaseReference nesnesi (referansı) gerekmektedir.

Bir referans üzerinde veri yazma, güncelleme ve silme (Write, update, or delete data at a reference)


Basit yazma işlemlerinde; setValue()  metodunu kullanarak belirli bir referansa veri kaydedebilir, ve bu yol (path) üzerinde olan bir veriyi değiştirebilirsiniz. Bu metodun kullanımı,

  • Aşagıdaki veri türlerine karşılık gelen JSON tipleri için uygundur.
    • String
    • Long
    • Double
    • Boolean
    • Map<String, Object>
    • List<Object>
  • Parametre almayan bir yapıcıya, ve sahip olduğu özellikler (properties) için erişilebilir (public) seviyede getirici (getter) methodlarına sahip olan Java sınıfı; özelleştirilmiş Java nesnesi (Object) olarak atanabilir.

Eğer bir Java nesnesi kullanırsanız; bu nesnenin içerikleri child konumlarına göre otomatik olarak iç içe haritalanır. Bu şekilde Java nesnesi kullanımı kodunuzu daha okunabilir yapar ve kodun bakımı daha da kolaylaşır.

Örnegin; şunun gibi basit kullanıcı profilli bir uygulamanız varsa, User nesneniz de;

setValue() metodu ile kullanıcı ekleyebilirsiniz.

setValue()  kullanılarak, belirli yerde bulunan her bir child node üzerine veri yazılabilir. Bununla birlikte tüm nesneyi tekrar yazmaya gerek kalmadan da bir child güncellenebilir. Eğer kullanıcıların profillerini güncellemesine imkan vermek isterseniz, username şu şekilde güncellenebilir :

Veri Listesine Ekleme Yapmak (Append to a list of data)

Çok kullanıcılı uygulamalarda bir listeye veri eklemek için push() metodunu kullanabilirsiniz. push() metodu benzersiz (unique) bir ID oluşturur ve bunu belirlenmiş olan Firebase referansına yeni bir child olarak ekler. Listedeki her yeni eleman için bu otomatik oluşturulan anahtarlar kullanılır. Aynı anda birden çok kullanıcı; hiç bir çakışma olmadan, aynı yere bir çok child ekleyebilir. push()  metodu tarafından tek ve benzersiz olarak üretilen bu ID’ler oluşturulma zamanlarına göre tasnif edilir. Böylece listeki veriler kronolojik olarak sıralanır.

Bu eklenen child’ların otomatik olarak oluşturulan anahtarlarının değerini almak, yada bu child’ların verilerini değiştirmek için push() metodunu kullanabilirsiniz. push() metodu üzerinde çağırılan getKey() metodu otomatik oluşturulan anahtarın değerini bize geri döndürecektir.

Veri yapınızı sadeleştirmek için otomatik oluşturulan anahtarları kullanabilirsiniz. Daha fazla bilgi için, fan-out örneğine bakabilirsiniz.

Belirli Alanları Güncelleme (Update specific fields)

Birden fazla child node’a; diğer child node’lara dokunmadan, aynı anda veri yazabilmek için updateChildren() metodu kullanabilirsiniz.

updateChildren() metodunu çağırarak; yerini (path) belirlediğiniz anahtarlar ile, düşük-seviye child’ların değerlerini güncelleyebilirsiniz. Eğer birçok konumda depolanan veriler daha iyi bir şekilde derecelendirilecekse (to scale) data fan-out örneğindeki gibi güncellenebilir. Mesela bir sosyal blog uygulaması aşağıdaki gibi bir Post sınıfına sahip olabilir:

Blog uygulamasında; bir gönderi oluşturmak, ve eş zamanlı olarak hem haber kaynağını hemde kullanıcının kendi sayfasını güncellemek için şunun gibi bir kod kullanabilirsiniz :

Bu örnekte, push() metodu kullanılarak tüm kullanıcıların gönderilerini içeren kısımda /posts/$postId konumunda gönderiler oluşturulur, ve aynı anda oluşturulan gönderinin anahtarı getKey() metodu ile alınır. Bu anahtar; daha sonra kullanıcının kendi gönderilerinin bulunduğu /user-posts/$userId/$postId konumunda da kullanılarak 2. bir post oluşturulur.

Bu şekilde updateChildren() metodunu bir kez çağırarak; nasıl ki bu örnekte aynı anda 2 farklı yerde post oluşturulduysa, sizde JSON ağacındaki bir çok konumda eş zamanlı güncellemeler yapabilirsiniz. Bu şekilde yapılan eş zamanlı güncelleme işlemleri atomiktir, ya tüm güncellemeler başarılı olur yada hiç biri başarılı olmaz.

Veri Silme (Delete Data)

Veri silmenin en kolay yolu; veri konumunu belirten referans (DatabaseReference) üzerinden removeValue() metodunu çağırmaktır.

Ayrıca, belirlediğiniz veriye setValue() yada updateChildren() kullanarak null değerini yazarakta o veriyi silebilirsiniz. Bu teknik sayesinde updateChildren() kullanarak birden çok child’ı tek bir API ile silebilirsiniz.

İşlemin Tamamlandığına Dair Geri Bildirim Almak (Receive a completion callback)

Firebase Gerçek-Zamanlı Veri Tabanı sunucusunda (Firebase Realtime Database server) verinizin işlenip işlenmediğini öğrenebilmek için bir tamamlama dinleyicisi (completion listener) ekleyebilirsiniz. Tüm setValue() ve updateChildren() metodları; opsiyonel olarak bir tamamlama dinleyicisi alır, ve veri tabanınına yazma işlemi tamamlandığında bu dinleyici çağrılır. Eğer bu çağrı; herhangi bir sebepten dolayı başarısız olursa, dinleyici hatanın sebebini belirten bir nesneye dönüşmüştür.

Verileri işlem sırasına göre kaydetme (Save data as transactions)

Bir veri ile çalışırken; veri, artan sayaçlar gibi eş zamanlı modifikasyonlar yüzünden bozulabilir. Bu durumda bir transaction işlemi kullanabilirsiniz.

Bu işlem için bir güncelleme fonksiyonu ve bir tamamlama dinleyicisi olmak üzere 2 argüman verilir.  Güncelleme fonksiyonu datanın mevcut durumunu argüman olarak alır ve yazılmak istenen yeni datanın durumunu geri döndürür. Eğer başka bir istemci (client) ; sizin yazma işleminiz tamamlanmadan önce aynı yere veri yazarsa, güncelleme fonksiyonunuz yazılmış olan yeni veri ile tekrar çağrılır ve yazma işlemi tekrar denenir.

Mesela bu sosyal blog uygulamasında; kullanıcıların gönderileri beğenmesine yada beğenememesine izin verebildiğimiz gibi, bir gönderinin kaç beğeni aldığını şu şekilde takip edebiliriz :

Eğer transaction reddedilirse; sunucu mevcut verinin değerini geri döner, tekrar çalışır ve güncellenmiş değeri geri döndürür.

Not: Çünkü doTransaction() metodu çok defa çağrıldığında, null değerinde veri işlemek zorunda kalabilir. Uzak veri tabanınınızda veri var olsa bile; transaction çalıştığında yerel önbelleğe alınmamış olabileceği için, başlangıç değeri null olarak sonuçlanabilir.

 Çevrimdışı Veri Yazma (Write data offline)

Eğer istemci internet bağlantısını kaybetse bile, uygulamanız işlemlerine doğru şekilde devam edecektir.

Firebase veri tabanına bağlanan her istemci herhangi aktif bir verinin kendi iç versiyonunu sağlar. Veri yazıldığında, ilk olarak kendi yerel versiyonuna yazılmıştır. Daha sonra, Firebase istemcisi bu veriyi uzaktaki veri tabanı sunucusuyla ve diğer istemcilerle “best-effort” prensibine göre senkronize eder.

Sonuc olarak, tüm veri tabanına yapınlan tüm yazma işlemlerinde; veri sunucuya yazılmadan önce, tüm yerel olaylar (local events) hemen tetiklenir.  Bu da uygulamanızın; herhangi bir ağ yada bağlantı gecikmesini dikkate almadan duyarlılığını sürdürmesi anlamına gelir.

Bağlantınız yeniden sağlandığında uygulamanız; istemcinin senkronize olması için gerekli değişim olaylarını, sunucunun mevcut durumuyla birlikte herhangi bir özel kod yazmaya gerek kalmadan almaktadır.

Çevirinin Orjinali : https://firebase.google.com/docs/database/android/save-data

Çeviren : Burak AKSOY

You may also like...

2 Responses

  1. Cihad dedi ki:

    Çok yararli bir ceviri olmuş. Emeği geçenlere cok tesekkurler. Devamını bekliyorum 🙂

  2. Burak dedi ki:

    Çok güzel bir çeviri. Devamını bekliyoruz 🙂

Bir Cevap Yazın