DataStore (Kotlin Multiplatform)

Biblioteka DataStore przechowuje dane asynchronicznie, spójnie transakcyjne, z przezwyciężeniem niektórych wad SharedPreferences. Ten na temat tworzenia magazynu danych w projektach Kotlin Multiplatform (KMP). Więcej informacji o DataStore znajdziesz tutaj: podstawowej dokumentacji DataStore i oficjalnych przykładów.

Konfigurowanie zależności

DataStore obsługuje KMP w wersji 1.1.0 i nowszych.

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

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

Definiowanie klas DataStore

Możesz zdefiniować klasę DataStore za pomocą DataStoreFactory we wspólnej w udostępnionym module KMP. Umieszczanie tych klas we wspólnych źródłach który pozwala na ich udostępnianie między wszystkimi platformami docelowymi. Za pomocą Deklaracje actual i expect do utworzenia na poszczególnych platformach.

Tworzenie instancji DataStore

Musisz zdefiniować, jak utworzyć instancję obiektu DataStore na każdej platformie. Jest to jedyna część interfejsu API, która musi się znajdować na określonej platformie. z powodu różnic w interfejsach 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 oraz ścieżki 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, potrzebujesz fabryki bazy danych oraz ścieżki 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"
    }
)