DataStore: apa itu, dasar-dasar penyimpanan data dan pengganti SharedPreferences

Penulis: IT Sectr Diterbitkan: 2026-03-12 Waktu membaca: 9 mnt

DataStore — komponen dari library Jetpack yang dirancang untuk menyimpan data berukuran kecil dalam aplikasi Android. Berbeda dengan SharedPreferences, ia bekerja secara asinkron dan menjamin konsistensi data pada akses konkuren. Menurut data Google, 2024, DataStore menggunakan Kotlin Coroutines dan Flow, yang membuatnya aman untuk thread utama dan cocok untuk arsitektur reaktif.

Poin utama

  • DataStore — pengganti SharedPreferences dengan API asinkron dan tipe data melalui Protocol Buffers
  • Preferences DataStore — Key-Store sederhana dengan pembacaan melalui Flow dan transaksi
  • Proto DataStore — penyimpanan bertipe dengan migrasi skema otomatis
  • SharedPreferences — API sinkron yang memblokir thread UI pada volume besar
  • Migrasi dilakukan melalui antarmuka SharedPreferencesMigration tanpa kehilangan data

Apa itu DataStore?

DataStore — solusi dari Google untuk penyimpanan data lokal di Android, diperkenalkan pada tahun 2020 sebagai alternatif untuk SharedPreferences. Ini mendukung dua mode: Preferences DataStore (pasangan kunci-nilai sederhana) dan Proto DataStore (skema bertipe berdasarkan Protocol Buffers).

Keuntungan utama — asinkron penuh: semua operasi baca mengembalikan Flow dari Kotlin Coroutines, dan penulisan dilakukan dalam konteks coroutine. Ini menghilangkan pemblokiran thread utama, yang merupakan masalah tipikal SharedPreferences saat bekerja dengan volume data besar.

DataStore menjamin atomicitas operasi: penulisan konkuren tidak menyebabkan kehilangan data berkat model transaksional. Jika dua komponen secara bersamaan mengubah nilai yang sama, DataStore menangani konflik dengan benar melalui mekanisme compare-and-swap.

Menurut Google I/O 2023, DataStore digunakan di 40% proyek baru di Android, dan Google merekomendasikan migrasi dari SharedPreferences di semua aplikasi yang membutuhkan stabilitas penyimpanan pengaturan.

Arsitektur DataStore

Di dasar DataStore terdapat SingleProcessDataStore — implementasi yang bekerja dalam satu proses. Ia menggunakan penyimpanan file dengan kunci di tingkat file: saat menulis data, file dikunci, mencegah kerusakan pada akses konkuren.

DataStore secara otomatis menangani error deserialisasi: jika file rusak, ia mengembalikan nilai default dan menimpa file. Perilaku ini dikonfigurasi melalui corruptionHandler, yang dapat diatur saat pembuatan DataStore.

Masalah SharedPreferences yang dipecahkan DataStore

SharedPreferences menderita tiga masalah fundamental: pembacaan sinkron dari disk di thread utama, tidak ada jaminan atomicitas pada penulisan konkuren, dan ketidakmampuan pelacakan perubahan secara reaktif. DataStore memecahkan ketiganya: Flow untuk observasi, kunci file untuk atomicitas, dan API asinkron untuk keamanan thread.

Bagaimana DataStore bekerja di Android?

DataStore menyimpan data dalam file di memori internal perangkat. Preferences DataStore menggunakan format file yang mirip dengan SharedPreferences, tetapi dengan metadata tambahan untuk pemeriksaan integritas. Proto DataStore menggunakan format biner Protocol Buffers, yang mengurangi ukuran file dan mempercepat serialisasi.

Saat membaca data, DataStore memuat seluruh file ke memori satu kali, setelah itu pelanggan menerima status terkini melalui Flow. Perubahan ditransmisikan ke semua pelanggan aktif secara otomatis — tidak diperlukan pendaftaran listener manual seperti di SharedPreferences.

Prinsip kerja Preferences DataStore

Preferences DataStore menggunakan mekanisme serialisasi internal berbasis Map. Setiap entri adalah pasangan string dan tipe primitif (Int, Boolean, Float, Long, String, Set). Data disimpan dalam file XML, mirip dengan SharedPreferences, tetapi dengan penulisan atomik melalui kunci file.

Contoh pembuatan Preferences DataStore: ekstensi preferencesDataStore pada Context membuat singleton dengan nama file. Pada panggilan berulang, instance yang sama dikembalikan — ini menghilangkan duplikasi file dan kebingungan dengan instance penyimpanan yang berbeda.

Prinsip kerja Proto DataStore

Proto DataStore memerlukan pendefinisian skema data melalui file .proto dan kompilasi menggunakan plugin protobuf. Kelas Java yang dihasilkan digunakan sebagai satu-satunya titik masuk untuk semua bidang — ini menghilangkan kesalahan ketik pada kunci, yang tipikal untuk SharedPreferences.

Skema Proto DataStore didefinisikan sekali dan mendukung penambahan bidang baru tanpa kehilangan data lama. Jika di versi baru aplikasi ditambahkan bidang dengan nilai default, file lama akan dideserialisasi dengan benar — kompatibilitas mundur sudah tertanam dalam protokol.

Preferences DataStore dan Proto DataStore: perbandingan

Pilihan antara Preferences DataStore dan Proto DataStore tergantung pada kompleksitas data dan kebutuhan tipisasi. Kedua varian asinkron dan transaksional, tetapi berbeda dalam tingkat type-safety dan kinerja serialisasi.

KarakteristikPreferences DataStoreProto DataStore
TipisasiLemah (kunci-nilai)Kuat (kelas yang dihasilkan)
SerialisasiXML (bawaan)Protocol Buffers (protobuf)
Ukuran fileBesar (XML terbaca)Kecil (biner)
KompleksitasRendah (tanpa .proto)Sedang (memerlukan .proto)
Migrasi skemaTidak ada skemaOtomatis (proto)
KompatibilitasSharedPreferences (melalui migrasi)Hanya Proto DataStore

Kapan memilih Preferences DataStore

Preferences DataStore cocok untuk pengaturan sederhana: bendera pengaktifan fitur, string token otorisasi, jumlah peluncuran aplikasi. Jika data sedikit (hingga 10–15 kunci) dan tidak memerlukan skema ketat — Preferences DataStore memberikan ambang masuk minimal tanpa menghubungkan plugin protobuf.

Kapan memilih Proto DataStore

Proto DataStore dibenarkan ketika struktur data kompleks atau dapat berubah antar versi aplikasi. Misalnya, pengaturan profil pengguna atau konfigurasi pengujian A/B dengan 20+ bidang. Protobuf memberikan tipisasi kuat dan migrasi otomatis, yang menghilangkan error runtime karena ketidakcocokan kunci.

Cara migrasi dari SharedPreferences ke DataStore

Google menyediakan mekanisme migrasi bawaan melalui kelas SharedPreferencesMigration. Migrasi dilakukan satu kali pada peluncuran pertama setelah pembaruan aplikasi: DataStore membaca data dari SharedPreferences, menulisnya dalam formatnya sendiri, dan menandai migrasi sebagai selesai.

Migrasi mendukung transformasi kustom: jika di SharedPreferences kunci tidak cocok dengan kunci DataStore yang diinginkan, fungsi transformasi dapat didefinisikan melalui SharedPreferencesMigration. Ini memungkinkan penggantian nama kunci dan perubahan tipe data dalam proses migrasi.

Migrasi langkah demi langkah

Langkah pertama: tambahkan DataStore ke build.gradle dan buat instance DataStore dengan migrasi: SharedPreferencesMigration menerima nama file SharedPreferences dan set kunci yang akan dipindahkan. Langkah kedua: hapus semua kode yang bekerja melalui SharedPreferences dan ganti dengan panggilan DataStore. Ketiga — uji migrasi: pada peluncuran pertama data akan muncul di DataStore, dan file SharedPreferences lama akan berhenti digunakan.

kotlin
val Context.dataStore by preferencesDataStore(
    name = "settings",
    produceMigrations = { context ->
        listOf(
            SharedPreferencesMigration(context, "old_prefs")
        )
    }
)

Contoh penggunaan DataStore dalam kode

DataStore mudah diintegrasikan ke dalam proyek yang ada. Berikut adalah contoh praktis untuk Preferences DataStore dan Proto DataStore — keduanya menunjukkan pembacaan, penulisan, dan observasi reaktif data.

Preferences DataStore: membaca dan menulis pengaturan

Dalam contoh ini Preferences DataStore menyimpan tiga pengaturan: tema gelap, nama pengguna, dan jumlah peluncuran. Pembacaan dilakukan melalui ekstensi .data, yang mengembalikan Flow. Penulisan — melalui fungsi suspend .edit, yang menjamin atomicitas perubahan.

kotlin
val Context.settingsDataStore by preferencesDataStore(name = "settings")

val isDarkMode: Flow<Boolean> = settingsDataStore.data
    .map { preferences ->
        preferences[booleanPreferencesKey("dark_mode")] ?: false
    }

suspend fun toggleDarkMode() {
    settingsDataStore.edit { prefs ->
        val current = prefs[booleanPreferencesKey("dark_mode")] ?: false
        prefs[booleanPreferencesKey("dark_mode")] = !current
    }
}

Proto DataStore: skema dan penggunaan

Proto DataStore memerlukan pendefinisian file .proto. Setelah kompilasi, dibuat kelas UserSettings yang digunakan untuk membaca dan menulis. Migrasi versi skema dijelaskan dalam file .proto yang sama dan diterapkan secara otomatis.

kotlin
// user_preferences.proto
syntax = "proto3";

message UserPreferences {
    string display_name = 1;
    int32 notification_count = 2;
    bool notifications_enabled = 3;
}

// Membaca dari DataStore
val userPreferencesFlow: Flow<UserPreferences> =
    protoDataStore.data

// Menulis nilai baru
suspend fun updateDisplayName(name: String) {
    protoDataStore.updateData { prefs ->
        prefs.toBuilder()
            .setDisplayName(name)
            .build()
    }
}

Observasi reaktif perubahan

DataStore terintegrasi dengan arsitektur MVVM melalui ViewModel. Flow dari DataStore dikumpulkan melalui .stateIn dan digunakan di UI. Setiap perubahan data, UI diperbarui secara otomatis — tidak diperlukan pembaruan manual atau LiveData.

kotlin
class SettingsViewModel(
    private val dataStore: DataStore<Preferences>
) : ViewModel() {

    val uiState: StateFlow<SettingsUiState> =
        dataStore.data
            .map { prefs ->
                SettingsUiState(
                    isDarkMode = prefs[booleanPreferencesKey("dark_mode")] ?: false,
                    counter = prefs[intPreferencesKey("launch_count")] ?: 0
                )
            }
            .stateIn(
                scope = viewModelScope,
                started = SharingStarted.WhileSubscribed(5000),
                initialValue = SettingsUiState()
            )
}

Pertanyaan yang sering diajukan

Apa kelebihan DataStore dibanding SharedPreferences?

DataStore bekerja secara asinkron (tidak memblokir thread UI), mendukung akses konkuren melalui transaksi, dan memungkinkan langganan reaktif terhadap perubahan melalui Flow. SharedPreferences — API sinkron dengan risiko ANR pada volume data besar dan tanpa dukungan reaktivitas bawaan.

Bisakah DataStore digunakan dengan Java?

DataStore ditulis dalam Kotlin dan memerlukan Kotlin Coroutines. Menggunakannya dari Java dimungkinkan tetapi tidak nyaman: harus membuat pembungkus dengan CompletableFuture atau mengelola coroutine secara manual. Untuk proyek Java, Google merekomendasikan tetap menggunakan SharedPreferences atau menambahkan Kotlin ke modul.

Apakah DataStore cocok untuk menyimpan data dalam jumlah besar?

DataStore memuat seluruh file ke memori saat membaca, sehingga tidak cocok untuk menyimpan daftar atau objek besar. Untuk skenario seperti itu, gunakan Room atau SQLite. DataStore dioptimalkan untuk pengaturan dan data terstruktur kecil — hingga ratusan kilobyte.

Bagaimana menangani error file DataStore yang rusak?

Saat pembuatan DataStore, corruptionHandler dapat diteruskan — fungsi yang dipanggil saat file rusak. Secara default, DataStore melemparkan pengecualian CorruptionException. Di corruptionHandler, data kosong dapat dikembalikan, setelah itu DataStore akan menimpa file dengan status yang benar.

Apakah Proto DataStore memerlukan file .proto wajib?

Ya, Proto DataStore memerlukan pendefinisian skema dalam file .proto dan menghubungkan plugin protobuf-gradle-plugin. Jika proyek kecil dan data sederhana, lebih mudah menggunakan Preferences DataStore — tidak memerlukan konfigurasi build tambahan.

Kesimpulan

  • DataStore — pengganti modern SharedPreferences yang bekerja dengan Kotlin Coroutines dan Flow
  • Preferences DataStore — kunci-nilai sederhana tanpa skema, cocok untuk pengaturan
  • Proto DataStore — penyimpanan bertipe dengan skema protobuf dan migrasi otomatis
  • Migrasi dari SharedPreferences ke DataStore sudah tertanam melalui SharedPreferencesMigration
  • Keamanan thread — semua operasi asinkron, pemblokiran UI dikecualikan
  • Reaktivitas — Flow memberi tahu pelanggan pada setiap perubahan data
  • Rekomendasi — gunakan DataStore di semua proyek Android baru, migrasikan yang sudah ada saat bekerja dengan pengaturan

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga