Android Jetpack DataStore – Preferences

Jetpack ile gelen Preferences DataStore yapısını Kotlin projemizde nasıl kullanabileceğimize değiniyoruz.

Jetpack DataStore başlığı altında Preferences DataStore ve Proto DataStore adlarında yapıları çıkardı. Bu yapılardan olan Preferences DataStore, aslında bildiğimiz yapılardan olan SharedPreferences’in yenilenmiş bir versionudur.

Resmi geliştirici dokümantasyonunda aynen şöyle yazıyor;

Nesneleri protokol arabellekleriyle saklamanıza izin veren bir veri depolama çözümüdür.

DataStore, verileri eşzamansız, tutarlı ve işlemsel olarak depolamak için Kotlin eşyordamlarını ve Flow’u kullanır.

Şu anda veri depolamak için SharedPreferences kullanıyorsanız, bunun yerine DataStore’a geçmeyi düşünün.

Not: Büyük veya karmaşık veri kümelerini, kısmi güncellemeleri veya bilgi bütünlüğünü desteklemeniz gerekiyorsa DataStore yerine Room kullanmayı düşünün. DataStore, küçük, basit veri kümeleri için idealdir ve kısmi güncellemeleri veya referans bütünlüğünü desteklemez.

Şimdi bir kotlin projesinde bu Preferences DataStore’u nasıl kullanabileceğimize gelelim. İlk olarak tabii kütüphanesini projemize dahil etmemiz gerekmektedir.

implementation "androidx.datastore:datastore-preferences:1.0.0"

Ben örneğimde Öğrenci verisi üzerinden ilerlemek istedim bu nedenle Student adında bir data class oluşturalım;

data class Student(
    val nameSurname:String,
    val emailAdress: String,
)

şimdi DataStoreManager adlı bir sınıf oluşturalım;

class DataStoreManager(val context: Context) {

}

DataStore sınıfından bir preferences üretelim;

class DataStoreManager(val context: Context) {
   private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "STUDENT_DATASTORE")
}

preferencesDataStore altında saklamak istediğimiz verilerimiz için gerekli olan değişkenleri oluşturalım.

companion object {
   val NAMESURNAME = stringPreferencesKey("NAMESURNAME")
   val EMAIL = stringPreferencesKey("EMAIL")
}

bir veriyi dataStore üzerine ekleyebilmek için gerekli olan fonksiyonumuzu üretelim;

suspend fun savetoDataStore(student: Student) {
        context.dataStore.edit {
            it[NAMESURNAME] = student.nameSurname
            it[EMAIL] = student.emailAdress
        }
}

ilgili Student verisini çağırabilmek için gerekli fonksiyonumuzu üretelim;

suspend fun getFromDataStore() = context.dataStore.data.map {
        Student(
            nameSurname = it[NAMESURNAME]?:"",
            emailAdress = it[EMAIL]?:""
        )
}

Sınıfımızın son hali;

import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import kotlinx.coroutines.flow.map

class DataStoreManager(val context: Context) {

    private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "STUDENT_DATASTORE")
    companion object {
        val NAMESURNAME = stringPreferencesKey("NAMESURNAME")
        val EMAIL = stringPreferencesKey("EMAIL")
    }

    suspend fun savetoDataStore(student: Student) {
        context.dataStore.edit {
            it[NAMESURNAME] = student.nameSurname
            it[EMAIL] = student.emailAdress
        }
    }
    suspend fun getFromDataStore() = context.dataStore.data.map {
        Student(
            nameSurname = it[NAMESURNAME]?:"",
            emailAdress = it[EMAIL]?:""
        )
    }
}

Activity sınıfı layout’ı içerisine nesneleri dahil edelim;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical"
    >

    <EditText
        android:id="@+id/etNameSurname"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="Name" />

    <EditText
        android:id="@+id/etEmail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textEmailAddress" />

    <Button
        android:id="@+id/btnSave"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Save" />
</LinearLayout>

Verilerimizi EditText nesnelerinden alıp butona tıklayınca Preferences DataStore sınıfımız üzerinden kaydedilmesini sağlayalım;

class MainActivity : AppCompatActivity() {

    lateinit var etNameSurname: EditText
    lateinit var etEmailAdress: EditText
    lateinit var btnSave: Button
    lateinit var ds:DataStoreManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        ds = DataStoreManager(this)

        etNameSurname = findViewById(R.id.etNameSurname)
        etEmailAdress = findViewById(R.id.etEmail)
        btnSave = findViewById(R.id.btnSave)
        btnSave.setOnClickListener {
            GlobalScope.launch() {
                ds.savetoDataStore(student = Student(
                    nameSurname = etNameSurname.text.toString(),
                    emailAdress = etEmailAdress.text.toString()
                ))
            }
        }
    }
}

kayıtlı bir veriyi çağırmak için yine aynı yöntem ile;

class MainActivity : AppCompatActivity() {

    lateinit var etNameSurname: EditText
    lateinit var etEmailAdress: EditText
    lateinit var btnSave: Button
    lateinit var ds:DataStoreManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        ds = DataStoreManager(this)

        etNameSurname = findViewById(R.id.etNameSurname)
        etEmailAdress = findViewById(R.id.etEmail)
        btnSave = findViewById(R.id.btnSave)
        btnSave.setOnClickListener {
            GlobalScope.launch() {
                ds.savetoDataStore(student = Student(
                    nameSurname = etNameSurname.text.toString(),
                    emailAdress = etEmailAdress.text.toString()
                ))
            }

            GlobalScope.launch(Dispatchers.IO) {
                ds.getFromDataStore().catch {
                        e -> e.printStackTrace()
                }.collect {
                   Log.d("testlog",it.nameSurname)
                }
            }
        }

    }
}

collect diyerek ds.getFromDataStore üzerine kayıtlı student verisini yakalayabiliriz.

Keyifli çalışmalar dilerim…

Yorum bırakın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top