Android Academy · Pelajaran

Pilihan DataStore

Gantikan SharedPreferences dengan pustaka DataStore moden. Baca data sebagai Kotlin Flow, tulis menggunakan edit{}, dan kendalikan ralat dengan selamat.

Pelajaran 5 daripada 613 langkah

Pilihan DataStore ialah pelajaran Android Academy percuma di CoddyKit. Ini ialah pelajaran 5 daripada 6. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Android Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Android Academy merangkumi sejumlah 6 pelajaran.

Mengapa DataStore?

DataStore ialah pengganti moden untuk SharedPreferences. Ia menyelesaikan masalah sebenar:

  • SharedPreferences menyekat utas UI — DataStore sepenuhnya tak segerak
  • SharedPreferences boleh menimbulkan pengecualian yang tidak dikendalikan — DataStore mengendalikan ralat melalui Flow
  • DataStore mempunyai keselamatan jenis (Preferences) atau keselamatan skema (Proto)
  • Berfungsi secara natif dengan Kotlin Coroutines dan Flow

Dua Jenis DataStore

Pilih jenis yang sesuai untuk kes penggunaan anda:

  • Preferences DataStore — pasangan nilai kunci, tiada skema diperlukan. Paling mudah untuk disediakan. Sesuai untuk tetapan aplikasi dan pilihan pengguna.
  • Proto DataStore — objek bertaip menggunakan Protocol Buffers. Memerlukan fail skema .proto. Sesuai apabila anda mempunyai data berstruktur.

Pelajaran ini merangkumi Preferences DataStore.

Menambah Kebergantungan

Tambahkan DataStore pada app/build.gradle:

// 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'
}

Mencipta Instance DataStore

Cipta DataStore sekali sahaja menggunakan delegat peringkat atas. Biasanya dilakukan dalam fail berasingan:

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")

Menentukan Kunci

Kunci ialah objek selamat jenis, bukan rentetan biasa. Cipta kunci menggunakan fungsi kilang yang betul:

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")
}

Menulis Data

Tulis di dalam rutin menggunakan edit { }:

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
    }
}

Membaca Data dengan Flow

DataStore mendedahkan data sebagai Flow. Gunakan map untuk mengekstrak nilai yang diperlukan:

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"
    }

Mengumpulkan Data dalam ViewModel

Dedahkan Flow daripada DataStore melalui ViewModel menggunakan stateIn untuk pengumpulan yang cekap:

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)
        }
    }
}

Memerhati dalam Activity/Fragment

Kumpulkan StateFlow dalam UI menggunakan lifecycleScope.launch:

// 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
            )
        }
    }
}

Pengendalian Ralat

DataStore menghasilkan IOException jika fail rosak. Tangkapnya dalam saluran Flow anda:

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
    }

DataStore berbanding SharedPreferences

Ringkasan sebab DataStore lebih baik:

  • DataStore membaca dan menulis secara automatik pada bebenang latar — tiada risiko ANR
  • apply() SharedPreferences boleh gagal secara senyap; DataStore menyebarkan ralat melalui Flow
  • DataStore bersifat reaktif — UI dikemas kini secara automatik apabila data berubah
  • SharedPreferences tiada laluan migrasi; DataStore mempunyai SharedPreferencesMigration terbina dalam

Semakan Pantas

Apakah mekanisme utama yang digunakan oleh DataStore untuk mendedahkan datanya kepada bahagian lain aplikasi?

Ulang Kaji: Preferences DataStore

DataStore ialah cara moden untuk menyimpan data mudah secara kekal:

  • Tambahkan kebergantungan datastore-preferences
  • Cipta satu instance menggunakan delegat preferencesDataStore
  • Tentukan kunci selamat jenis dengan stringPreferencesKey, booleanPreferencesKey dan sebagainya
  • Tulis menggunakan dataStore.edit { } di dalam rutin
  • Baca sebagai Flow dengan dataStore.data.map { }
  • Kendalikan IOException dengan .catch { emit(emptyPreferences()) }

Seterusnya: bina penyesuai senarai yang cekap dengan DiffUtil.

Percuma untuk bermula

Pelajari Kotlin dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
36
Pelajaran
152

Soalan Lazim

Adakah pelajaran “Pilihan DataStore” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Android Academy, termasuk “Pilihan DataStore”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Android Academy merangkumi sejumlah 6 pelajaran.

Apakah yang akan saya pelajari dalam “Pilihan DataStore”?

Gantikan SharedPreferences dengan pustaka DataStore moden. Baca data sebagai Kotlin Flow, tulis menggunakan edit{}, dan kendalikan ralat dengan selamat. Anda berlatih Android Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Android Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Android Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 5 daripada 6.

Berapa lamakah pelajaran “Pilihan DataStore” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Android Academy ini?

Ya. Setiap pelajaran Android Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Koleksi Kotlin
  2. Asas RecyclerView
  3. Peristiwa Klik RecyclerView
  4. SharedPreferences
  5. Pilihan DataStore
  6. Penyesuai & DiffUtil
← Kembali ke Android Academy