Firebase Realtime Database ile örnek uygulama

Merhabalar bu yazımda Firebase Realtime Database kullanımı hakkında temel pratik bilgiler vereceğim, örnek üzerinden anlatmaya çalışacağım.

İsminden de anlaşılacağı üzere gerçek zamanlı bulut üzerinde çalışan bir NoSQL veritabanı sistemidir. Veri JSON olarak saklanır. Veriyi çekerken asenkron olarak çeker. Diğer ayırt edici özelliklerinden bahsedecek olursak:

  • Gelişmiş yapısı sayesinde güncel verilere ve bildirimlere anında ulaşmak mümkündür 
  • Veriyi aynı Firebase  projesi içerisinde birden fazla veri tabanına bölebilme imkanı sunar
  • Bir satır kodla offline işlem gerçekleştirebilir
  • Herhangi bir server’a ihtiyaç duymaz
  • İçerisinde güvenlik kuralları tanımlanabilir

Şimdi adım adım nasıl kullanılır ondan bahsedeyim. Örnek olarak bir şirketteki işçilerin iş giriş çıkışını kontrol eden bir uygulamamız olsun.  

İlk olarak kodumuza Firebase Realtime Database entegresini Android Studio yardımıyla gerçekleştiriyoruz. Daha sonra kod içerisinde veri tabanındaki belirlenen düğüme referans alma işlemine geçiyoruz.

MainActivity içerisinde field olarak şu değişkeni initialize ediyoruz:

private static FirebaseDatabase mDatabaseIns; 

Daha sonra onCreate() metodu içerisinde aşağıda instance alma işlemini gerçekleştiriyoruz: 

if (mDatabaseIns == null) { 
	mDatabaseIns = FirebaseDatabase.getInstance(); 
	mDatabaseIns.setPersistenceEnabled(true); // disk persistance(offline) 
 } 

Yukarıda bahsettiğim offline işlem yapmayı tek satırda hallettim. Aslında yaptığı şey, eğer o an internet yoksa gerekli bilgiyi geçici olarak depolama birimine kaydedecek, internete bağlanıldığı zaman da Firebase’e gönderecek. 

Burdan sonra işçi giriş mi çıkış mı yapıyor onu kontrol edeceğiz, bu kontrole göre de veritabanı içerisinden referansımızı alacağız.

User user = new User(mName, currentTime, date,  mEntrance); 

if (mDurum == DURUM_GIRIS) { 
	DatabaseReference user_details = mDatabaseIns.getReference("Giriş"); 
	String userId = user_details.push().getKey(); 
	user_details.child(userId).setValue(user); 

} else if (mDurum == DURUM_CIKIS) { 
	DatabaseReference user_details = mDatabaseIns.getReference("Çıkış"); 
	String userId = user_details.push().getKey(); 
	user_details.child(userId).setValue(user); 
} 

Burada veritabanı içerisinde bulunan bir düğümden referans aldım. Giriş yapıyorsa Giriş düğümünden, çıkış yapıyorsa da Çıkış düğümünden referans aldım.

Sonra bu düğüme child veri kaydedeceğim. Burada verimi push edebilmem için bi unique key almam gerekiyor daha sonrasında bu aldığım key’e verimi push’layacağım.

String userId = user_details.push().getKey(); // get unique key 
user_details.child(userId).setValue(user); // push my user object to this key value 

Firebase içerisinde şu şekilde gözükecektir (uygulamayı biraz editlemiştim, o yüzden resimde değerler İngilizce) :

Şimdi bu push ettiğim değerleri uygulamanın başka bi fragment içerisinde almak istiyorum, onu verileri de referans alarak çekeceğiz. Giriş yapan tüm işçilerin listesini çekip veri tabanından aşağıdaki kodla çekiyorum . Burada da tüm child düğümlerin üzerinde iterasyon yaparak getValue() metodu yardımıyla JSON verisini deserialize ediyorum.

DatabaseReference enteredUsersRef = user_details.child("Giriş"); 
enteredUsersRef.addValueEventListener(new ValueEventListener() { 
	@Override 
	public void onDataChange(@NonNull DataSnapshot dataSnapshot) { 
		for (DataSnapshot uniqueKeySnapshot : dataSnapshot.getChildren()) { 
			//Loop 1 to go through all the child nodes of users 
			User user = uniqueKeySnapshot.getValue(User.class); 
			Log.i("RECORDSFRAGMENT", user.toString()); 
			workerArray.add(user); 
		} 
		TextView textView = view.findViewById(R.id.list_records_text); 
		textView.setVisibility(View.GONE); 
	} 
}); 

Çektiğim verimi uygulamamda kullandım. Örnek ekran görüntüsü:

Firebase Storage ve Firebase Authentication hakkında yazdığım diğer yazılarımı okuyabilirsiniz.