Android Firebase Veritabanı CRUD İşlemleri

Merhaba arkadaşlar,

Bu dersimizde Google’un öne sürdüğü Firebase platformunun Realtime Database bulut servisini inceleyeceğiz. Ayrıca, gerçek zamanlı Firebase  Veritabanı 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.

Cloud Messaging ile Push Notification gönderme dersimizi daha önce anlatmıştık bu linkten inceleyebilirsiniz.

Ayrıca banner reklam ekleme desteği ile ilgili dersimizi de bu linkten inceleyebilirsiniz.

Örneğin üye giriş, çıkış ve kayıt işlemlerini authentication özelliğini kullanarak firebase in bize sunmuş olduğu servis sayesinde kısa yoldan halledebiliriz. Geliştirilen bir çok uygulama platform bağımsız olarak düşünüldüğünde aynı veriye her cihazdan erişmek ister. Uygulamalarda en çok önemli olan kaynakta veridir. Geliştirdiğiniz uygulamada login sistemi yer alıyorsa kullanıcı bilgilerine erişme, saklama ; uygulamanızı kullanan kişilerin bir takım bilgilerden haberdar olmasını istiyorsanız bildirim gönderme; uygulamanızın verilerini analiz edip, kaç crash yaşanmış hangi cihazlarda yaşanmış vb. gibi ayrıntılı crash raporlarına ulaşma ; ayrı bir veritabanı ve sunucu desteği oluşturmadan gerçek zamanlı verilere ulaşma gibi bir çok özelliği içinde barındıran firebase platformunu daha kapsamlı incelemek için kendi sitesini inceleyebilirsiniz. ( https://firebase.google.com )

Android Firebase Veritabanı CRUD İşlemlerini oluşturmak için gerekli adımları oluşturmaya başlayalım. Öncelikle android uygulamamızı oluşturuyoruz. Android Studio yu açtığımızda resimdede gördüğünüz gibi Tools sekmesinden Firebase seçeneğinde tıklıyoruz.( Tools -> Firebase )

Karşımızda çıkan ve yukarıda da bahsetmiş olduğum özelliklerden Realtime Database tıklıyoruz.

Daha sonra karşımıza çıkan pencerede çıkan seçenekleri uyguluyoruz. ( 1-Connect to Firebase ,

2- Add the Realtime Database to your app vb. ) Connect to Firebase dediğimizde developer console hesabımız olması gerekiyor zaten giriş yapmadıysanız uyarıyı alacaksınız bende gmail hesabım ile girişimi gerçekleştiriyorum. Buradaki işlemleri uyguladığımızda android studio da otomatik olarak gerekli alt yapıyı bize çıkaracaktır.

Android uygulamamızın adını yazıyoruz, Connect to Firebase tıklıyoruz ve hemen ardından Accept Changes diyoruz. Console Firebase sitesine girdiğimizde android uygulamamızı yarattığımızı görüyoruz.

Yukarıda gördüğünüz gibi uygulamamızı database realtime için hazır hale getirdik şimdi veritabanına read ve write işlemlerini yapabilmemiz için bu platformdan izin vermemiz gerekiyor. RULES yazan kısımdan read ve write işlemlerini true yapıp Publish ediyoruz.

( Firebase de bulunan bu rules sayesinde kullanıcıların yetkilerini kısıtlayabilir , sadece belirli verilere erişmesini sağlayabilir ve kendi kurduğunuz yapıya göre olmasını istediğiniz kontrolleri ekleyebilirsiniz. )

Şimdi uygulamamızda kullanacağımız veritabanı yapısını oluşturalım ben Müşteri -> Sipariş ilişkisini kullanacağım. Her bir müşteri farklı farklı siparişler verebilir. Örneğin x müşterisinin ; T-shirt aldığını düşünelim. y müşteriside gömlek alabilir. Yani bir müşteri birden fazla ürün sipariş verebilir. Veritabanı chartımız da aşağıdaki gibidir.

Veritabanımız şekillendiğine göre şimdi kodlamaya geçebiliriz , Customer ve Order Modellerimizi oluşturalım.

Customer.java

Order.java

Modellerimizi tanımladıktan sonra MainActivity sınıfımıza bakalım. Kodları incelerseniz eğer uygulama ilk açıldığında onStart methodunda Database reference üzerinden DataSnapshot ile child lara ulaşıyoruz ve ilgili kayıtlar var ise Customer modeline atarak Recyclerview in adapterına set ediyoruz. Böylece realtime database de Customer ile ilgili kaç kayıt var ise hepsini getirip ekranda göstermiş oluyoruz.

Veritabanında herhangi bir değişikliği dinlemek için addValueEventListener()  yapısını kullanıyoruz. Uygulamamızda göreceğiniz gibi veritabanında bir değişiklik yaptığımızda örneğin update, delete anında o verinin değiştiğini göreceksiniz. Firebase console dan da girerek örneğin; müşterinin adını değiştirdiğimizde android uygulamamızda yer alan müşterinin adınında otomatik olarak değiştiğini göreceksiniz.

Bir önceki makalede addValueEventListener() isimli veri tabanı dinleyicisini kullanmıştık. Bu dinleyici; veri tabanında her hangi bir değişiklik olduğunda harekete geçerek veri tabanının güncel halini bize göstermektedir.

MainActivity de customer yapısını göstereceğimiz için onCreate methodunda reference ulaşıyoruz.

Kayıt işlemi içinde aşağıdaki yapıyı oluşturuyoruz. FloatingButtona basıldığı anda ;her kayıt birbirinden farklı olması için bir id alıyoruz (customerId) kullanıcı uygulamada müşteri adını soyadını girdiğinde ve adres spinnerdan ilgili adresi seçtiğinde customer objesini oluşturuyoruz. Database reference in child methoduna id yi atıp setValue ile customer objemizi kaydediyoruz. Uygulama içinden kayıt işlemini bu şekilde yapıyoruz ayrıca firebase platformundan kendi oluşturduğumuz bir json dosyasını import ederek de kayıtları oluşturabiliriz.

Uygulamamızı çalıştırıp customer ve order eklediğimizde aşağıdaki json çıktısını aldığımızı göreceksiniz.

MainActivity.java

Kaydettiğimiz müşterileri ekranda gösterirken kullandığımız Recyclerview in Adapter yapısıda aşağıdadır. Adapter yapısını inceledğimizde müşteri güncelleme ve müşteri silme işlemlerinde yer aldığını göreceksiniz.

Recyclerview de listelediğimiz müşterilerden birini silmek için yapılan işlemler ; hangi müşteriyi silmek istiyorsak o müşterinin customerId sine göre ilgili reference çekiyoruz ve removeValue() fonksiyonu ile kayıtı siliyoruz. Tabi bu müşterinin siparişleri de olabilir bu yüzden sadece müşteriyi silmek yetmez; ilgili müşterinin siparişini de çekip removeValue() ile kaldırıyoruz.

Recyclerview de listelediğimiz müşterilerden birini güncellemek için yapılan işlemler ise yine aynı mantıkla aşağıda gösterilmiştir.

CustomerAdapter.java

Recyclerview da müşteriye tıkladığımızda ilgili müşterinin siparişlerinin olduğu sayfaya gidiyoruz. Yine daha önceden eklenen bir sipariş kaydı var ise ekranda gösteriyoruz. Ayrıca yeni bir sipariş girip kayıt edebiliyoruz.

DetailActivity.java

Gördüğünüz gibi Firebase veritabanı sistemi NOSQL olarak çalıştığı için tablolar yoktur ve sorgu yazmaya gerek kalmadan kolayca CRUD işlemlerini gerçekleştirebilirsiniz. En önemli özelliği ise asenkron olarak çalışarak ; anlık veri değişimlerini kullanıcıya gösterebilmesidir.  Örneğin müşteri kaydı yapıyoruz ve bağlantı yok bu offline durumunda ise çalışmaya devam ederek gerekli bağlantı sağlandığı anda güncellemeyi yaparak kullanıcıya değişikliği gösterir. Firebase gerçekten çok kapsamlı ve performanslı bir yapıya sahip bu yüzden detaylı olarak inceleyip örnekleri arttırmak gerekir. Ben sadece temel olarak sizlere firebase veritabanı yapısını CustomerOrder ilişisi üzerinden anlatmaya çalıştım.

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..

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)

36 Yorum

  • Ders için teşekkür ederiz. Peki Ben mesela bir soru cevap uygulamasında verileri kaydettim felan ama Puanlarına göre nasıl sıralayıp çekebilirim. Mesela 100 üzerinden 96puan alan 1. sırada olsun 55puan alan 2. sırada olması gerekiyor. Nasıl yapabilirim?

  • Tebrikler eğitici bir paylaşım. Son girilen veriyi ilk sırada göstermek istiyorum. Nasıl yapabilirim ? Teşekkürler…

  • Merhaba ders için teşekkürler. Fakat ücretsiz plan aylık 100 kullanıcıya kadar izin veriyor. Diğer planlardan hangisini seçmek mantıklıdır sizce? Ya da şöyler söyleyim benim app içerisinde gerçek zamanlı bir chat odası kullandım Blaze paketi kullansam ki çok fazla bir şey yapmayacağım sadece kullanıcı sayısı sınırsız olsun diye chat içerisinde resim falan yok yazı ve emoji aylık ne kadar öderim tahminizce yada sırf bunun için değer mi?

    • Merhaba , kaynak kodları indirip çalıştırdınız mı ? dersin videosunu izlediniz mi ? firebase de veritabanı json datalar sayesinde oluşturulur. DatabaseReference databaseReferenceCustomers = FirebaseDatabase.getInstance().getReference(“customers”); dediğimizde customers parent olarak oluşur daha sonra da customers in içini siz şekillendirirsiniz o yapıda yine json olarak oluşturulur. kaynak kodları detaylıca inceleyip debug ederseniz anlamanız daha da kolaylaşacaktır yine sorunuz olursa sorabilirsiniz.

  • public static final String CUSTOMER_NAME = “com.mobilhanem.androidcrudexample.customername”;
    public static final String CUSTOMER_ID = “com.mobilhanem.androidcrudexample.customerid”;
    burdaki paket adını neye göre vericem ben kendi projemde
    public static final String CUSTOMER_ID =”” şu şekilde tanımlasak olur mu

    • Merrhaba, kendi projen için sıfırdan oluşturuyorsan kendi paket adını kullanmalısın önrk: com.mobilhanem.androidcrudexample benim oluşturduğum uygulamaya ait sende kendine göre oluştururusun com.paketadi.projeadi gibi

  • Müşteri ekledigimde müsteri gözükmüyor activity_main.xml de RecyclerView: No adapter attached; skipping layout hatası veriyor

    • Merhaba, buradaki kaynak kodu indirip denediğinizde mi bu hatayı alıyorsunuz ? video yu izlediyseniz eğer sıkıntısız çalışıyor biraz önce tekrardan denedim bu hatayla karşılaşmadım kod da değişiklik mi yaptınız tekrardan bi kontrol edermisiniz.

  • merhabalar
    bu projenin içindeki detail activity bulunan sipariş ve fiyat giriniz yerine iki sayıyı toplayarak siparişler kısmında 1. sayı, 2.sayı ve sonuc işlemini yazdırmak istiyorum. bunu nasıl yapabilirim.

    • Merhaba , çalıştırmaya çalıştığınızda nasıl bir hata alyıorsunuz logcat çıktısını atar mısınız ?

  • Merhaba bir sorum daha olacaktı.
    Ben uygulama da fazla müşteri olunca onu bulabilmek için searchview butonu yaptım. Tek sorunum müşteri buluyor ama siparişler kısmını gelince ilk sıradaki müşterinin siparişleri geliyor. Bunu nasıl düzeltebilirim.

    • Merhaba,
      FirebaseDatabase.getInstance().getReference(“orders”).child(intent.getStringExtra(MainActivity.CUSTOMER_ID)); bu kodu incelediniz mi ? müşteriyi buluyorsa müşterinin id sini order ile eşleştirmeyi deneyip o müşteriye özgü olan orders ları çekebilirsin diye düşünüyorum.

      • Merhaba,
        Müşterilerin id’sini order ile eşleştirmesini yapmayı deniyeceğim. Bir sorum daha var 🙂 Firebase konsolunda Crash Reporting kısmında durmadan hata maili alıyorum. Bunun nedeni nedir. Bilginiz varsa yardımcı olabilir misiniz 🙂

        • Merhaba uygulamanıza firebase crash reporting servisini ekleyip aktif mi ettiniz ? muhtemelen öyle ise uygulamanız herhangi bir nedenle crash oluyordur firebase de sizi bilgilendirme amacıyla crash bilgisini gönderiyordur.

          • Evet öyle yapmıştım şimdi kaldırdım. Genel maillerden bir sorun olmaz demi.

  • Merhabalar
    Projede searchview yaptığımı söylemiştim sizde müşteriyi buluyorsa müşterinin id sini order ile eşleştirmeyi deneyip o müşteriye özgü olan orders ları çekebilirsin demiştiniz. Ben bunu yapamadım. Nasıl yapabilirim.Bilgi verirseniz sevinirim:)

  • Merhaba
    customer da olan gibi order da optionmenu yapıp düzenle sil yapmak istiyorum.Ama yaptıgımda hep hata alıyorum.
    Order order = postSnapshot.getValue(Order.class);
    Bu kısımda hep bir hata veriyor.Acaba nedendir

    • Merhaba, nasıl bir hata alıyorsunuz logda yazması gerekiyor. öncelikle buradaki kod yapısını mı deniyorsunuz yoksa sizin oluşturduğunuz yapıyı mı ? en yukarıda dersin videosunu incelerseniz eğer create-read-delete-update bütün işlemlerin düzgün bir şekilde çalıştığını göreceksiniz kodu düzgün bir şekilde inceleyin lütfen.

      • Merhaba Sizin kodun yapısını kullanıyorum. Hersey tam olarak çalışıyor. ben sipariş kısmında optionMenu yapmak istiyorum. o zaman hata oluyor.
        logcat aldığım hata böyle. com.google.firebase.database.DatabaseException: Failed to convert value of type java.lang.Long to String atcom.mobilhanem.androidcrudexample.DetailActivity$1.onDataChange(DetailActivity.java:50)

        • hata loguna bakarsanız eğer failed to convert value type long to string diyor yani long bi değeri stringe dönüştürmeye çalışırken hata alıyorsunuz veritabanına eklerken yada bir işlem yaparken değişkenlerin tiplerini bir kez daha kontrol edin. string,int,long vb.

        • Aynısını bende yaşadım silme ve ya customer sınıfından direk databaseden ilgili node a erişip silebiliyoruz ama order sınıfından yapmaya çalıştığımız zaman olmuyor nedeni ise order lar customer a bağlı yani ordera customer üzerinde ulaşmamız lazım elimizde ilgili customerın id si lazım ancak öyle silme düzeltme işlemi yapabilirsiniz

    • Merhaba, müşteri silmede yazmış olduğum kod mantığının aynısını burada uygulayabilirsiniz kodun neresinde takıldığınız ?

      • Merhaba, aynısını uyguladım ama silemiyorum sebebi ise elimde ürün id si var ve müşteri id sini bilmiyorum dolayısıyla erişemiyorum silmek için

  • Merhaba spinnerdaki verileri ben databaseden almak istiyorum datayı spinnera çekip görüntüleyebiliyorum ama databaseye kaydedemiyorum. Bu konuda ne yapabilirim? Teşekkürler

Haftalık Bülten

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