0Pricing
Android Academy · Pelajaran

Preferensi DataStore

Ganti SharedPreferences dengan pustaka DataStore modern. Baca data sebagai Kotlin Flow, tulis menggunakan edit{}, dan tangani error dengan aman.

Preferensi DataStore adalah pelajaran Android Academy gratis di CoddyKit. Ini adalah pelajaran 5 dari 6. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Android Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Android Academy mencakup 6 pelajaran total.

Mengapa DataStore?

DataStore adalah pengganti modern untuk SharedPreferences. DataStore mengatasi masalah nyata:

  • SharedPreferences memblokir thread UI — DataStore sepenuhnya asinkron
  • SharedPreferences dapat menimbulkan pengecualian yang tidak tertangani — DataStore menangani error melalui Flow
  • DataStore memiliki keamanan tipe (Preferences) atau keamanan skema (Proto)
  • Bekerja secara native dengan Kotlin Coroutines dan Flow

Dua Jenis DataStore

Pilih jenis yang sesuai dengan kebutuhan Anda:

  • Preferences DataStore — pasangan kunci-nilai, tanpa skema. Paling sederhana untuk disiapkan. Cocok untuk setelan aplikasi dan preferensi pengguna.
  • Proto DataStore — objek bertipe menggunakan Protocol Buffers. Memerlukan berkas skema .proto. Cocok jika Anda memiliki data terstruktur.

Pelajaran ini membahas Preferences DataStore.

Menambahkan Dependensi

Tambahkan DataStore ke 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'
}

Membuat Instans DataStore

Buat DataStore satu kali menggunakan delegasi tingkat atas. Biasanya dilakukan dalam berkas terpisah:

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

Mendefinisikan Kunci

Kunci adalah objek yang aman terhadap tipe, bukan string biasa. Buat kunci dengan fungsi pabrik yang tepat:

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

Lakukan penulisan di dalam coroutine 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 menyediakan data sebagai Flow. Gunakan map untuk mengambil nilai yang Anda perlukan:

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 di ViewModel

Sediakan Flow dari DataStore melalui ViewModel menggunakan stateIn agar pengumpulan data berlangsung efisien:

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

Mengamati di Activity/Fragment

Kumpulkan StateFlow di 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
            )
        }
    }
}

Penanganan Kesalahan

DataStore menghasilkan IOException jika berkas rusak. Tangkap kesalahan tersebut dalam alur 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 vs SharedPreferences

Ringkasan alasan DataStore lebih unggul:

  • DataStore membaca dan menulis secara otomatis di thread latar belakang — tanpa risiko ANR
  • apply() milik SharedPreferences dapat gagal secara diam-diam; DataStore meneruskan kesalahan melalui Flow
  • DataStore bersifat reaktif — UI diperbarui secara otomatis saat data berubah
  • SharedPreferences tidak memiliki jalur migrasi; DataStore memiliki SharedPreferencesMigration bawaan

Pemeriksaan Singkat

Apa mekanisme utama yang digunakan DataStore untuk menyediakan datanya kepada bagian lain aplikasi?

Ringkasan: Preferences DataStore

DataStore adalah cara modern untuk menyimpan data sederhana secara permanen:

  • Tambahkan dependensi datastore-preferences
  • Buat satu instans dengan delegasi preferencesDataStore
  • Definisikan kunci yang aman terhadap tipe dengan stringPreferencesKey, booleanPreferencesKey, dan sebagainya
  • Tulis data dengan dataStore.edit { } di dalam coroutine
  • Baca data sebagai Flow dengan dataStore.data.map { }
  • Tangani IOException dengan .catch { emit(emptyPreferences()) }

Berikutnya: buat adaptor daftar yang efisien dengan DiffUtil.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Preferensi DataStore” gratis?

Ya — teks lengkap “Preferensi DataStore” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Android Academy, upgrade ke CoddyKit PRO. Kursus Android Academy mencakup 6 pelajaran total.

Apa yang akan aku pelajari di “Preferensi DataStore”?

Ganti SharedPreferences dengan pustaka DataStore modern. Baca data sebagai Kotlin Flow, tulis menggunakan edit{}, dan tangani error dengan aman. Kamu berlatih Android Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Android Academy?

Tidak diperlukan pengalaman sebelumnya. Android Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 5 dari 6.

Berapa lama pelajaran “Preferensi DataStore” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Android Academy ini?

Ya. Setiap pelajaran Android Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Koleksi Kotlin
  2. Dasar RecyclerView
  3. Peristiwa Klik RecyclerView
  4. SharedPreferences
  5. Preferensi DataStore
  6. Adapter & DiffUtil
← Kembali ke Android Academy