Pilihan DataStore
Gantikan SharedPreferences dengan pustaka DataStore moden. Baca data sebagai Kotlin Flow, tulis menggunakan edit{}, dan kendalikan ralat dengan selamat.
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
SharedPreferencesMigrationterbina 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,booleanPreferencesKeydan sebagainya - Tulis menggunakan
dataStore.edit { }di dalam rutin - Baca sebagai
FlowdengandataStore.data.map { } - Kendalikan
IOExceptiondengan.catch { emit(emptyPreferences()) }
Seterusnya: bina penyesuai senarai yang cekap dengan DiffUtil.
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
- Koleksi Kotlin
- Asas RecyclerView
- Peristiwa Klik RecyclerView
- SharedPreferences
- Pilihan DataStore
- Penyesuai & DiffUtil