Hoş geldin Datastore, görüşürüz SharedPreferences

Android geliştiricilerin sıklıkla kullandığı SharedPreferences’in eksiklerini gidermek adına Datastore adı ile yeni bir kütüphane yayınladı.


Kas 02, 2021
hamurcuabi

1
521

SharedPreferences Eksikleri Neler ?

  • Tüm getyöntemler eşzamanlıdır ve tercihler dosyası belleğe yüklenene kadar beklemek zorundadır, bu nedenle UI iş parçacığından çağrılırsa ANR'ye neden olabilir.
  • Yapılacak setişlemlerinde başarılı veya başarısız olma durumunu takip etmez.
  • 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.
  • Type-safety desteklemez.

Datastore’da Neler Var?

  • Verileri eşzamansız (asynchronously) olarak depolamak için Kotlin kütüphaneleri olan Coroutine ve Flow kullanır.
  • Dosyaya yazma işlemi Flow sayesinde eşzamansız olarak yapılır ve bu işlemler Dispatchers.IO’ da yapıldığı için uygulama akışını bozmaz.
  • UI iş parçacığında kullanılması tamamen güvenlidir. Veriler artık XML biçiminde değil, Google’ın ikili protobuf biçiminde kaydedilir.

Jetpack DataStore, anahtar-değer (key-value) çiftlerini veya yazılan nesneleri protokol arabellekleriyle (protocol buffers) depolamanıza olanak tanıyan bir veri depolama çözümüdür. DataStore, verileri eşzamansız (asynchronously), tutarlı ve işlemsel olarak depolamak için Kotlin Coroutines ve Flow kullanır.

Daha çok detaylı bilgi almak isteyenler için: https://android-developers.googleblog.com/2020/09/prefer-storing-data-with-jetpack.html

Preferences DataStore ve Proto DataStore

DataStore iki farklı uygulama sağlar: Preferences DataStore ve Proto DataStore. Preferences DataStore, anahtarları kullanarak verileri depolar ve bunlara erişir. Bu uygulama önceden tanımlanmış bir şema(schema) gerektirmez ve tür güvenliği sağlamaz(type safety). Proto DataStore, verileri özel bir veri türünün örnekleri olarak depolar. Bu uygulama, protokol arabelleklerini(protocol buffers) kullanarakbir şema(schema) tanımlamanızı gerektirir, ancak tür güvenliği sağlar.

Bilgi yeter kod zamanı !

Bugün sizlerle Preferences DataStore ile bir örnek yapmaya çalışağım. Yazılan kodlar github sayfamda paylaşılacaktır. Ayrıca kodlarn tümünü gist olarak bırakıyorum.

1.Datastore oluşturma

Aşağıdaki kod parçacığında görüldüğü gibi Context üzerinden extension func kullanarak myDataStore adında bir preferences dataStore oluşturduk. PreferenceKeys objesi ise datastore dosyası içinde saklayabileceğimiz veri tiplerini ve bu verinin yazılıp okunurken için gerekli olan name bilgisini saklıyor. Bunlar String,Boolean,Float,Long olabilir.Her biri için ayrı ayrı örnekler proje içerisinde mevcut.

const val USER_PREFERENCES_NAME = "data_store_preferences"

//extension for data store
val Context.myDataStore by preferencesDataStore(
    name = USER_PREFERENCES_NAME
)

object PreferenceKeys {
    val MY_STRING = stringPreferencesKey("my_string")
    val MY_BOOLEAN = booleanPreferencesKey("my_boolean")
    val MY_INT = intPreferencesKey("my_int")
    val MY_LONG = longPreferencesKey("my_long")
    val MY_FLOAT = floatPreferencesKey("my_float")
}

2.Veri okuma (String)

Yazılan func okunmasını istediğimiz PreferenceKeys parametresini alıp dosyadan asenkron olarak okuma işlemi yapıyor ve bu işlem sonucunda bir hata ile karşılaşırsa bundan haberimiz oluyor. Eğer bilgiyi bulamazsa default olarak “no_value” return ediyor.Null olma durumdaki return değerini kendiniz belirlyebilrisiniz.

fun readStringFromDataStore(key: Preferences.Key<String>): Flow<String> {
    return context.myDataStore.data
        .catch { ex ->
            if (ex is IOException) {
                emit(emptyPreferences())
            } else throw ex
        }
        .map { preferences ->
            val showCompleted = preferences[key] ?: "no_value"
            showCompleted
        }
}

3.Veri Yazma (String)

Görüldüğü gibi suspend keywordu ile yazma işlemi yapıyor. Bu işlem Dispatchers.IO ile yapılacağı için uygulama akışında bir sorun yaratmıyor.

suspend fun saveStringToDataStore(key: Preferences.Key<String>, name: String) {
    context.myDataStore.edit { preferences ->
        preferences[key] = name
    }
}

Datastore konusu en basit ve anlaşılır hali ile anlatmaya çalıştım. Github sayfamdaki örnekprojede ViewModel ve Repository kullanarak MVVM yapısına uygun hareket etmeye çalıştım. Umarım sizlere ufak bir faydam olmuştur. Bir sonraki yazılarda görüşmek dileğiyle mutlu kodlamalı günler.

Proje link: https://github.com/hamurcuabi/DataStoreDemo

datastore jetpack shared

Yorumlar


Kasım 05, 202112:24 @Mustafa

Müthiş kolay ve güvenli imiş bu yav. En yakın zamanda yazın sayesinde kolayca entegre edeceğim projelerime. Var olasın :)