Android Academy · Ders

DataStore Tercihleri

SharedPreferences yerine modern DataStore kitaplığını kullanın. Verileri Kotlin Flow olarak okuyun, edit{} ile yazın ve hataları güvenli şekilde yönetin.

5. ders / 613 adım

DataStore Tercihleri, CoddyKit'te ücretsiz bir Android Academy dersidir. Bu, 6 dersinin 5. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Android Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Android Academy kursu toplamda 6 dersten oluşur.

Neden DataStore?

DataStore, SharedPreferences'ın modern alternatifidir. Gerçek sorunları çözer:

  • SharedPreferences kullanıcı arayüzü iş parçacığını engeller — DataStore tamamen eşzamansızdır
  • SharedPreferences yakalanmamış özel durumlar oluşturabilir — DataStore hataları Flow aracılığıyla yönetir
  • DataStore tür güvenlidir (Preferences) veya şema güvenlidir (Proto)
  • Kotlin Coroutines ve Flow ile yerel olarak çalışır

İki Tür Veri Deposu

Kullanım amacınıza uygun türü seçin:

  • Preferences Veri Deposu — anahtar-değer çiftleri kullanır, şema gerekmez. Kurulumu en kolay seçenektir. Uygulama ayarları ve kullanıcı tercihleri için idealdir.
  • Proto Veri Deposu — Protocol Buffers kullanılarak oluşturulan türü belirlenmiş nesnelerdir. Bir .proto şema dosyası gerektirir. Yapılandırılmış verileriniz olduğunda idealdir.

Bu derste Preferences Veri Deposu ele alınmaktadır.

Bağımlılığı Ekleme

Veri Deposunu app/build.gradle dosyasına ekleyin:

// app/build.gradle
dependencies {
    implementation 'androidx.datastore:datastore-preferences:1.1.1'
    // Coroutines (likely already in your project)
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'
}

Veri Deposu Örneği Oluşturma

Üst düzey temsilciyi kullanarak Veri Deposunu bir kez oluşturun. Bu işlem genellikle bağımsız bir dosyada yapılır:

import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.preferencesDataStore

// Top-level property — creates a single DataStore instance per Context
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "user_prefs")

Anahtarları Tanımlama

Anahtarlar düz dizeler değil, tür güvenli nesnelerdir. Bunları doğru fabrika işleviyle oluşturun:

import androidx.datastore.preferences.core.booleanPreferencesKey
import androidx.datastore.preferences.core.intPreferencesKey
import androidx.datastore.preferences.core.stringPreferencesKey

object PreferencesKeys {
    val DARK_MODE    = booleanPreferencesKey("dark_mode")
    val USER_NAME    = stringPreferencesKey("user_name")
    val LAUNCH_COUNT = intPreferencesKey("launch_count")
}

Veri Yazma

Bir eş yordamın içinde edit { } kullanarak yazın:

import androidx.datastore.preferences.core.edit

// In a ViewModel or Repository:
suspend fun saveDarkMode(enabled: Boolean) {
    context.dataStore.edit { prefs ->
        prefs[PreferencesKeys.DARK_MODE] = enabled
    }
}

suspend fun incrementLaunchCount() {
    context.dataStore.edit { prefs ->
        val current = prefs[PreferencesKeys.LAUNCH_COUNT] ?: 0
        prefs[PreferencesKeys.LAUNCH_COUNT] = current + 1
    }
}

Flow ile Veri Okuma

Veri Deposu, verileri Flow olarak sunar. İhtiyacınız olan değeri çıkarmak için map kullanın:

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

val darkModeFlow: Flow<Boolean> = context.dataStore.data
    .map { prefs ->
        prefs[PreferencesKeys.DARK_MODE] ?: false  // default = false
    }

val userNameFlow: Flow<String> = context.dataStore.data
    .map { prefs ->
        prefs[PreferencesKeys.USER_NAME] ?: "Guest"
    }

ViewModel'de Toplama

Verimli bir şekilde toplamak için stateIn kullanarak Veri Deposu Flow'larını bir ViewModel'den sunun:

class SettingsViewModel(private val repo: SettingsRepository) : ViewModel() {

    val isDarkMode: StateFlow<Boolean> = repo.darkModeFlow
        .stateIn(
            scope = viewModelScope,
            started = SharingStarted.WhileSubscribed(5000),
            initialValue = false
        )

    fun toggleDarkMode(enabled: Boolean) {
        viewModelScope.launch {
            repo.saveDarkMode(enabled)
        }
    }
}

Activity/Fragment İçinde Gözlemleme

StateFlow'u kullanıcı arayüzünde lifecycleScope.launch kullanarak toplayın:

// In Fragment:
lifecycleScope.launch {
    viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
        viewModel.isDarkMode.collect { darkMode ->
            binding.switchDarkMode.isChecked = darkMode
            AppCompatDelegate.setDefaultNightMode(
                if (darkMode) AppCompatDelegate.MODE_NIGHT_YES
                else AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
            )
        }
    }
}

Hata İşleme

Dosya bozulmuşsa Veri Deposu IOException yayınlar. Bunu Flow işlem hattınızda yakalayın:

import kotlinx.coroutines.flow.catch
import java.io.IOException

val safeFlow: Flow<Boolean> = context.dataStore.data
    .catch { exception ->
        if (exception is IOException) {
            emit(emptyPreferences())   // return defaults
        } else {
            throw exception
        }
    }
    .map { prefs ->
        prefs[PreferencesKeys.DARK_MODE] ?: false
    }

Veri Deposu ve SharedPreferences Karşılaştırması

Veri Deposunun neden üstün olduğunun özeti:

  • Veri Deposu okumaları ve yazmaları otomatik olarak arka plan iş parçacığında gerçekleştirir — ANR riski yoktur
  • SharedPreferences apply() sessizce başarısız olabilir; Veri Deposu hataları Flow üzerinden iletir
  • Veri Deposu reaktiftir — veriler değiştiğinde kullanıcı arayüzü otomatik olarak güncellenir
  • SharedPreferences için geçiş yolu yoktur; Veri Deposunda yerleşik bir SharedPreferencesMigration bulunur

Hızlı Kontrol

Veri Deposunun verilerini uygulamanın geri kalanına sunmak için kullandığı temel mekanizma nedir?

Özet: Veri Deposu Tercihleri

Veri Deposu, basit verileri kalıcı olarak saklamanın modern yoludur:

  • datastore-preferences bağımlılığını ekleyin
  • preferencesDataStore temsilcisiyle tek bir örnek oluşturun
  • stringPreferencesKey, booleanPreferencesKey ve benzeri işlevlerle tür güvenli anahtarlar tanımlayın
  • Bir eş yordamın içinde dataStore.edit { } ile yazın
  • dataStore.data.map { } ile Flow olarak okuyun
  • .catch { emit(emptyPreferences()) } ile IOException hatasını işleyin

Sırada: DiffUtil ile verimli liste bağdaştırıcıları oluşturma var.

Başlamak ücretsiz

Yapay zeka eğitmeniyle Kotlin öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
36
Dersler
152

Sıkça Sorulan Sorular

“DataStore Tercihleri” dersi ücretsiz mi?

Evet — “DataStore Tercihleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Android Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Android Academy kursu toplamda 6 dersten oluşur.

“DataStore Tercihleri” dersinde ne öğreneceğim?

SharedPreferences yerine modern DataStore kitaplığını kullanın. Verileri Kotlin Flow olarak okuyun, edit{} ile yazın ve hataları güvenli şekilde yönetin. Android Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Android Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Android Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 6 dersinin 5. dersidir.

“DataStore Tercihleri” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Android Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Android Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Kotlin Koleksiyonları
  2. RecyclerView Temelleri
  3. RecyclerView Tıklama Olayları
  4. SharedPreferences
  5. DataStore Tercihleri
  6. Adaptörler ve DiffUtil
← Android Academy Sayfasına Dön