Jetpack Datastore Entegrasyonu

Görsel Referansı


Google developer ekibi, Android tarafında geliştiricilerin sıklıkla kullandığı SharedPrefences'in eksiklerini gidermek adına yeni bir kütüphane yayınladı.



DataStore Nedir?


Jetpack DataStore, key - value değerlerini ve yazılan nesnelerini protokol arabellekleri ile depolanmasına olanak tanıyan bir veri depolama kütüphanesidir. SharedPrefences ise küçük verileri key - value ilişkisi içerisinde tutulabilen bir veri saklama yöntemidir. Genel kullanım olarak, basit kullanıcı tercihleri, login hatırlama bilgilerini saklamak için kullanılır.


SharedPrefences'in DataStore'a Göre Eksik Yönleri

  • SharedPrefences, yapılacak setleme işlemlerinde başarılı veya başarısız olma durumunu takip etmez.

  • SharedPrefences, API ve işlem çağrıları sağlamaz. Örneğin, veriler aynı anda güncellenirse, bir olası çakışma meydana gelme durumu oluşabilir.

  • SharedPrefences, Type-safety desteklemez.


DataStore Avantajları

  • DataStore, verileri eşzamansız (asynchronously) olarak depolamak için güçlü Kotlin kütüphaneleri olan Coroutine ve Flow kullanılır.

  • Yani, dosyaya yazma işlemi Flow sayesinde eşzamansız olarak yapılır ve bu işlemler Dispatchers.IO'da yapılır. Bu sayede genel olarak uygulama akışını bozmaz.

  • Datastore, verilerin protokol arabellekleri ile kalıcı olmasına izin verir.


DataStore vs Proto DataStore


Jetpack DataStore kitaplığı içinde iki farklı kütüphane vardır, Datastore ve Proto DataStore.

Proto DataStore, nesneyi tanımlamak için şema kullanır. Verileri depolamak için keyleri değil, dosyaları kullanır. En büyük farkı budur.


SharedPrefences vs DataStore


DataStore Entegrasyonu


İlk bölümde DataStore özelliğine yakından baktık ve SharedPrefences ile farkına değindik. Bu bölümde ise DataStore'ın nasıl kullanıldığını örnek bir projeyle öğreneceğiz. Bu uygulamada basitçe kullanıcının girişteki bilgilerini lokalde tutan bir ekran yaratıp bu bilgileri DataStore ile tutacağız.


İlk olarak Android Studio'da bir proje açalım, sonrasında build.gradle dosyasına gelelim ve gerekli implementasyonları yapalım.



Örnek projede DataBinding kullandığım için DataBinding'i implement ediyorum. build.gradle dosyası içerisinde android {} scope'u altına ekleyelim.



 buildFeatures {      
       dataBinding true 
    }

Sonrasında çok basit bir şekilde aşağıdaki ekranı oluşturalım.




Manager Paketi Oluşturma


Layoutu oluşturduktan sonra logic işlemlerine geçebiliriz. DataStore için, bir manager sınıfına ihtiyacımız var. Peki burada ne yapacağız? Bu sınıfta, tutmak istediğimiz veri tiplerini oluşturup sonrasında Flow yardımıyla dataStore'a mapleme işlemi yapacağız.


İlk olarak, dataStore oluşturduk ve context yardımıyla erişmek için dataStore'u kullandık. "user_prefs" dataStore'ın lokalde oluşturduğu isimdir. Companion object içinde, tutmak istediğimiz veri tiplerini belirtiyoruz. Örnek ekran görüntüsüne göre, isim, yaş ve boolean değeri olduğu için string, int ve boolean değerlerini tutmamız gerekiyor. Sonrasında her bir değişkene ulaşabilmek için bir name veriyoruz.


storeUser fonksiyonu bir coroutines fonksiyonudur. Kısaca özetlemek gerekirse, suspend fun sayesinde bir iş parçacağı yapılana kadar ana iş akışı devam eder ve başarılı döndüğü zaman iş akışına eklenir. suspend, bu fonksiyonun suspend edilebilir olduğunu yani işi bitene kadar durucağını ama aynı zamanda var olduğu thread'in (Eğer biz isteyerek blocklamazsak) blocklanmayacağını belirtiyor.


Kullanacağımız parametreleri, store içinde apply ediyoruz.



suspend fun storeUser(age:Int, name:String, isRemember:Boolean) {        dataStore.edit {            
it[USER_AGE_KEY] = age            
it[USER_NAME_KEY] = name            
it[USER_REMEMBER_KEY] = isRemember
        }
    }

Burada ise dataStore da tutmak istediğim her bir değişkenin flow yardımıyla mapleme işlemini yapıyoruz. Kaydedildiğinde bir toast mesajı da döndürüyoruz. Burada kullanım ihtiyaçlarınıza göre geliştirebilirsiniz.



val userAgeFLow:Flow<Int>= dataStore.data.map { val age = it[USER_AGE_KEY] ?:0
Toast.makeText(context, "You are age : $age", Toast.LENGTH_SHORT).show() 
   }

Activity Üzerinde Gösterme



MainActiviy içerisinde ilk olarak UserManager sınıfını oluşturuyoruz. Kullanıcının bilgilerini input olarak kaydetme işlemini GlobalScope.launch içerisinde gerçekleştiriyoruz. storeUser()'a istenen parametreleri yolladığımızda dataStore'da başarıyla tutmuş oluyoruz.


DataStore'da tuttuğumuz verileri okuyup ekranda göstermek için observeData() fonksiyonunun içini kullanıyoruz. Aşağıdaki kod parçacağında asLiveData ile datayı observe ediyoruz ve dinleyip sonrasında ekrana bastırıyoruz.


  userManager.userNameFlow.asLiveData().observe(this, {                        name = it           
 binding.tvName.text = it.toString()     
     })

Şimdi, uygulamayı açıp test edelim.



İkinci adımda bilgileri yazıp kaydediyoruz.



Uygulamayı kapatıp, açıyoruz.



Ve evet uygulamayı yeniden açtığımızda tuttuğumuz verileri görebildik. İşlemlerimiz bu kadar, sorular için dönüş yapabilirsiniz.


Github: https://github.com/merttoptas/getx_example


Kaynak

  1. Android Developers - DataStore

  2. Jetpack DataStore - Medium


#sharedprefences #datastore #jetpack #android #kotlin


Komünite

Platform

Mobiler.dev Anasayfa
  • Twitter
  • Instagram
  • development_düzenlendi_düzenlendi
  • Youtube
  • slack-icon-black_edited_edited_edited
  • Gri LinkedIn Simge
imageedit_2_9667998092.png
JetBrains Hakkında Detaylı Bilgi Alın

© 2020 by mobiler.dev

Kurumsal Yazar Hesapları

adesso.png
mobilerdevLogo.jpg
Yazarlık Başvurusu Hakkında Bilgi Alın, Başvuru Yapın.
Topluluk Yazarlarını Tanıyın