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 DataStoreandroidx.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"
}
)