Android Firebase Cloud Firestore Kullanımı

Merhaba arkadaşlar,

Bu dersimizde Google’un öne sürdüğü Firebase platformunun Cloud Firestore bulut servisini inceleyeceğiz. Ayrıca, cloud firestore özelliğini kullanarak CRUD (Create, Read, Update, Delete ) işlemlerini nasıl yapabileceğimizi de anlatacağım. Bildiğiniz üzere Firebase platformu sayesinde bir çok işlemi gerçekleştirebiliyoruz ve bu platform  ( Realtime database, cloud messaging, crash reporting, storage, authentication gibi özellikleri kullanabilmemizi sağlıyor. ) Firebase ayrıca NOSQL bir veritabandır yani hiç bir SQL sorgusu yazmadan gerekli tabloları oluşturup json formatı ile kontrol ederiz.

 

Bildiğiniz üzere Realtime-Database ( bu dersimizden inceleyebilirsiniz. ) veritabanı işlemleri için kullanılıyordu fakat hızla değişen ve gelişen büyük projelerde kullanılan veritabanı karmaşık bir hale geldiği için daha kullanışlı ve efektif olan Cloud Firestore yapısı karşımıza çıktı. Kısacası Cloud Firestore ; Google’nin büyük ve karmaşık yapıdaki verileri saklamak ve hızlıca sorgulamak amacıyla geliştirdiği dokuman tabanlı Nosql veritabanıdır.

Cloud Firestore Avantajları

Daha iyi sorgulama ve daha yapılandırılmış veriler: Sorgulama yapısı olarak daha çok seçenek bulunmaktadır ayrıca verileriniz belgeler ve koleksiyonlardan oluşmaktadır. Belgelere bağlı olarak başka belgeler oluşturulabilir. Böylece iç içe (Nested) verileri saklarken ve sorgularken Cloud Firestore daha performanslı ve esnek bir yapı sağlar.

Daha ölçeklendirilebilir bir yapı: Sorgularınızın veri kümenizle değil, sonuç kümenizin boyutuyla ölçeklendiğini belirtmek önemlidir. Dolayısıyla, veri kümeniz ne kadar büyük olursa olsun arama hızlı kalır.

Farklı ücretlendirme modeli: Firebase Realtime Database öncelikle depolama veya ağ bant genişliğine göre ücret alırken, Cloud Firestore öncelikle gerçekleştirdiğiniz işlem sayısına göre ücretlendirir. Buradaki avantaj geliştirdiğiniz uygulamaya göre değişir.

Zengin platform desteği: Bir çok platform da kullanılabilir. (Android, IOS, Web, Java, Node.js, Php, Go, Python..)

Çevrimdışı mod desteği: Offline modu desteği ile internet olmadığında cihazın localinden veriler okunabilir, yazılabilir.   İnternet geldiğinde otomatik olarak cloud veritabanına senkronizasyon yapılır. Yani client tarafındaki her değişiklik cloud veritabanımızı, cloud veritabanındaki her değişiklikte client tarafını etkilemektedir.

Cloud Firestore da verilerimiz koleksiyonlar (collection) halinde düzenlenmiş belgelerde (document) saklanır. Aşağıdaki resimde tam olarak veri saklama mantığını görmekteyiz.

Şimdi konuyu daha iyi anlayabilmek için Firestore uygulamasını oluşturalım. Firestore bağlantısı için Android Studio da bulunan özelliği kullanıyoruz ve hızlı bir şekilde uygulamamızda kullanacağımız yapıyı oluşturuyoruz. Realtime Database dersimde anlattığım gibi bağlantı ayarları Firestore için de aynı şekilde yapılmaktadır bu yüzden uzun uzun oralarda zaman kaybetmeden kodlama kısmına geçelim. Aşağıda gördüğümüz gibi Firestore seçeceğini seçip adım adım anlatılan işlemleri uygulayabilirsiniz. ( Uygulamamızda kullanacağımız Firestore kütüphanesinin gradle tarafına eklenmesini ve gerekli ayarların yapılandırılması sağlamış oluyoruz )

 

En sonunda https://console.firebase.google.com sitesinde projemizi Firestore için oluşturmuş oluyoruz. Android Studio da yer alan uygulamamızla buradaki proje adımız aynı. ( FirebaseCloudFirestoreProject olarak isimlendirdik )

 

Artık Firebase cloud yapımız oluştuğuna göre bazı kural setlerini belirtmemiz gerekiyor. Bu veritabanı üzerinde yazma ve okuma işlemleri yapabilmemiz için aşağıdaki şekilde bir ayarlama yapıyoruz ve yazmayıda okumayıda true olarak belirtiyoruz aksi takdirde veritabanı işlemleri yaparken izin verilmediği için sorunlar yaşabilirsiniz. Buradaki kural seti daha da kapsamlı olabilir onu siz kendiniz istediğiniz şekilde belirleyebilirsiniz. örneğin sadece sisteme authenticate olmuş kişilerin yazma ve okuma yapabilmesi gibi.

Android uygulamamızın build.gradle kısmı aşağıdaki gibidir. Firestore ile ilgili kütüphane denendencies lerin build.gradle içerisinde yer aldığını görüyoruz.

build.gradle

Yapacağımız örnek uygulamada kişi ekleme yapabileceğiz, eklediğimiz kişileri listeleyebileceğiz. Ayrıca kişilerle ilgili queryler oluşturup filtreleme yapabileceğiz. Bu filtrelemeler sonucunda belirli değişkenlere göre sıralama yapabileceğiz. Son olarak kişilerin özelliklerini update edip; seçtiğimiz kişiyi veritabanından silebileceğiz. 

Öncelikle kişi ekleme ve listeme yapacağımız için bizim bir modele ihtiyacımız var kişi bilgilerini içinde tutan bir model oluşturalım:

Person.java

Modelimizi oluşturduk şimdi kişileri listeleyeceğimiz için ekranda gözükmesini istediğiniz satırları oluşturmamız gerekiyor bunun için bir layout oluşturuyoruz.

person_item.xml 

Ekran görünümü:

Şimdi Adapter yapısını oluşturuyoruz; burada dikkat edilmesi gereken unsur normalde Adapter oluştururken RecylcerView adapter dan ya da custom adapter şeklinde oluşturulurdu ama biz FirestoreRecyclerAdapter sınıfını kullanıyoruz. Bu adapter da zaten RecyclerView.Adapter dan türeyen Firestore için geliştirilmiş bir adapter yapısıdır.

PersonAdapter.java

Şimdi activity sınıfımızda gerçekleştireceğiniz için işlemleri activity sınıfımızın layout xml oluşturuyoruz. Kişi Ekle ve Liste Sorgula butonu olduğunu görüceksiniz. Butonların altında da RecylcerView konumlandırdığımızı göreceksiniz.

activity_main.xml

 

Ekran görünümü:

 

 

 

 

 

 

 

 

 

 

 

Şimdi bu layout a bağlı olan Activity sınıfımızı oluşturalım.

MainActivity.java

Cloud Firestore CRUD İşlemleri

Şimdi yukarıda yer alan kod bloğunu incelemeye başlayalım;

  • Firestore veritabanına erişimi sağlamaktadır
  • Firestore veritabanı içerisinde yer alan collection kısmını elde etmemizi sağlar. Verilen keye göre biz gördüğünüz gibi kod kısmında “employees” olarak tanımladık; eğer var olan keye göre bir collection varsa bize o collection dönmesini sağlar yok ise de kendisi “employees” adında bir collection oluşturur.
  • MainActivity içerisinde yer alan savePersonDb methodunu incelediğimizde; Kişi Ekle butonuna basıldığında tetiklendiğini görüyoruz. Kullanıcı tarafından girilen değerler Edittext den alınıp HashMap içerisinde key-value şeklinde atılır daha sonra oluşan bu liste aşağıda gördüğünüz gibi document olarak set edilir. Listenerlar yardımcı ile de eğer kaydetme işlemi başarılı ise onSuccess methodu tetiklenir; değil ise onFailure methodu tetiklenir.
Kişi ekleme ekranı:

Aşağıdaki resimde Console firebase kısmına baktığımızda kaydedilen verilerin nasıl gözüktüğünü görmekteyiz:

not: Her bir belgenin kendine özgü bir ID si olmak zorundadır. Eğer biz yaratırken bir ID vermezsek Firestore otomatik olarak bir ID yaratacaktır. 

  • MainActivity sınıfı içerisinde yer alan onStart da startListening kodunu göreceksiniz. Bu yapı Adaptera özgüdür (FirestoreRecyclerAdapter) ve ekranda listelediğimiz öğelerin sürekli olarak dinlenmesi sağlar. Yani kaydettiğimiz verilerde herhangi bir değişiklik olması durumunda Adapter tetiklenerek RecyclerView kendini otomatik olarak günceller.
  • MainActivity sınıfı içerisinde yer alan onStop da stopListening kodunu göreceksiniz. Bu yapıda yine Adaptera (FirestoreRecyclerAdapter) özgüdür. Activity onStop tetiklendiğinde dinleme olayının durdurulmasını sağlar.
  • MainActivity sınıfı içerisinde yer alan Query ise dersi anlatırken bahsettiğimi sorguların oluşturulmasını sağlar. Kodu incelediğinizde collection yapımızı yaşa göre sıraladığımızı göreceksiniz. Yaşa göre sıralarkende ister küçükten büyüğe, istersek de büyükten küçüğe sıralama query si oluşturabiliriz.
  • MainActivity sınıfı içerisinde Adapter sınıfımıza gönderdiğimiz FirestorerRecyclerOptions yapısını göreceksiniz. Bu yukarıdaki query sınıfından gelen sorguyu alır ve build ederek oluşturmasını sağlar. Daha sonra Adaptera bunu göndererek veri kümesinin istenildiği şekilde oluşturulmasını sağlar.
  • MainActivity sınıfı içerisinde ItemTouchHelper yapısını göreceksiniz bu yapı CardView lerin swipe edilmesini sağlar. Sağa ve sola doğru swipe edebiliriz. Biz koddan sadece sol doğru kaydırılmasına izin verdik. Sola doğru kaydırılınca ilgili verimizin veritabanından silinmesini ve listemizin güncellenmesini istiyorsak; adapter sınıfında oluşturduğumuz deleteItem çağırıyoruz.
Adapter sınıfı içerisinde yer alan deleteItem ise; gelen position değerine göre Snapshot ler içerisinden ilgili dokumanı bulup silinmesi sağlamaktadır.
  • Şimdi de güncelleme işlemine bakalım; PersonAdapter yapısı içerisinde bir interface oluşturduk daha sonra listelenen verilerden herhangi birine tıklandığında tıklanma olayını MainActivity sınıfında yakaladık. Oluşturduğumuz interface yardımı ile onItemClick methoduna tıklanılan DocumentSnapshot değerini gönderdik.
Listelenen verilerden herhangi birine tıklandığında da kullanıcıya bir AlertDialog gösterdik. Yukarıda anlattığım DocumentSnapshot değerini aldıktan sonra Person objesine çevirdik. Sonuçta kaydettiğimiz veriler aslında birer Person sınıfı.
Artık Person objesi elimizde var kullanıcının listeden tıkladığı değer hangisi ise onunla ilgili verileri biliyoruz o verileri Edittext lere set ettik. Kullanıcı set edilen bu değerlerde değişiklik yapıp Güncelle butonuna bastığında ise aşağıdaki kod tetiklendi. Burada önemli nokta ilgili dokumanın id si güncelleme işleminide id ile yaptığımızı görüyorsunuz. set methodu ile de Person objesini güncelledik eğer güncelleme işlemi tamamlanırsa da onComplete methodunun tetiklendiğini göreceksiniz.
Kişi güncelleme ekranı :

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • Liste Sorgula butonuna basıldıktan sonra gerçekleşen işlemleri incelersek; whereEqualTo ile Title değeri “Android Developer” olan verileri getirmesini istiyoruz. İşlem bitince onComplete methodu tetikleniyor ve gelen task üzerinden task.getResult().size() dediğimiz de ise kaç tane değer döndüğünü görmüş oluyoruz.
 

Evet arkadaşlar Firebase Cloud Firestore Kullanımını temel bir proje yaparak sizlere anlatmaya çalıştım. Uygulamamızda CRUD (Create – Read- Update – Delete) işlemlerini inceledik. Projeyi indirip kaynak kodlarını da inceleyebilirsiniz. Firestore yapısını sıfırdan kendiniz oluşturabilirsiniz buradaki anlatımda kendi console firebase yapımı kullandığım için verileri console tarafından da değiştirmek isterseniz bu mümkün olmayacaktır. O yüzden dersteki kodları kendi projenizde uygulamanız daha verimli olacaktır. Umarım herkese faydalı olur.

Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.

Mobilhanem.com üzerinden anlattığımız mobil uygulama geliştirme derslerine devam edeceğiz. Konu hakkında sorunuzu yorum alanından sorabilirsiniz. Konu dışı sorularınızı ve tüm yazılımsal sorularınızı sorucevap.mobilhanem.com sitemizden de sorabilirsiniz.

Bir dahaki dersimizde görüşmek dileğiyle..

12

Alper Beyler

Yüksek Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği
Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği (4/3.30) (2010-2014)
Lisans : Viyana Teknik Üniversitesi / Bilgisayar Bilimleri (2013)

Yorum Yaz

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?