DataStore (Kotlin Multiplatform)

Biblioteka DataStore przechowuje dane asynchronicznie, w spójny i transakcyjny sposób, przezwyciężając pewne wady elementu SharedPreferences. Ta strona służy do tworzenia DataStore w projektach Kotlin Multiplatform (KMP). Więcej informacji o DataStore znajdziesz w podstawowej dokumentacji DataStore i w oficjalnych przykładach.

Konfigurowanie zależności

DataStore obsługuje KMP w wersjach 1.1.0 i nowszych.

Aby skonfigurować DataStore w projekcie KMP, dodaj zależności artefaktów w pliku build.gradle.kts modułu:

  • androidx.datastore:datastore – biblioteka DataStore
  • androidx.datastore:datastore-preferences – biblioteka preferencji DataStore

Zdefiniuj klasy DataStore

Możesz zdefiniować klasę DataStore za pomocą elementu DataStoreFactory wewnątrz wspólnego źródła udostępnionego modułu KMP. Umieszczenie tych klas we wspólnych źródłach umożliwia ich udostępnianie na wszystkich platformach docelowych. Do tworzenia implementacji na poszczególnych platformach możesz używać deklaracji actual i expect.

Tworzenie instancji DataStore

Musisz określić sposób tworzenia instancji obiektu DataStore na każdej platformie. Jest to jedyna część interfejsu API, która musi znajdować się w zestawach źródłowych platform z powodu różnic między interfejsami API systemu plików.

Częste

// shared/src/androidMain/kotlin/createDataStore.kt

/**
 * Gets the singleton DataStore instance, creating it if necessary.
 */
fun createDataStore(producePath: () -> String): DataStore<Preferences> =
        PreferenceDataStoreFactory.createWithPath(
            produceFile = { producePath().toPath() }
        )

internal const val dataStoreFileName = "dice.preferences_pb"

Android

Aby utworzyć instancję DataStore, potrzebujesz Context wraz ze ścieżką pliku.

// shared/src/androidMain/kotlin/createDataStore.android.kt

fun createDataStore(context: Context): DataStore<Preferences> = createDataStore(
    producePath = { context.filesDir.resolve(dataStoreFileName).absolutePath }
)

iOS

Aby utworzyć instancję DataStore, musisz mieć fabrykę bazy danych wraz ze ścieżką bazy danych.

// shared/src/iosMain/kotlin/createDataStore.kt

fun createDataStore(): DataStore<Preferences> = createDataStore(
    producePath = {
        val documentDirectory: NSURL? = NSFileManager.defaultManager.URLForDirectory(
            directory = NSDocumentDirectory,
            inDomain = NSUserDomainMask,
            appropriateForURL = null,
            create = false,
            error = null,
        )
        requireNotNull(documentDirectory).path + "/$dataStoreFileName"
    }
)