DataStore (Kotlin Multiplatform)

Die DataStore-Bibliothek speichert Daten asynchron, konsistent und transaktional und behebt einige der Nachteile von SharedPreferences. Auf dieser Seite geht es hauptsächlich um das Erstellen von DataStores in Kotlin Multiplatform (KMP)-Projekten. Weitere Informationen zu DataStore finden Sie in der Hauptdokumentation für DataStore und in den offiziellen Beispielen.

Abhängigkeiten einrichten

DataStore unterstützt KMP in Version 1.1.0 und höher.

Wenn Sie DataStore in Ihrem KMP-Projekt einrichten möchten, fügen Sie die Abhängigkeiten für die Artefakte in der Datei build.gradle.kts für Ihr Modul hinzu:

  • androidx.datastore:datastore – DataStore-Bibliothek
  • androidx.datastore:datastore-preferences: die Preferences DataStore-Bibliothek

DataStore-Klassen definieren

Sie können die DataStore-Klasse mit DataStoreFactory in der gemeinsamen Quelle Ihres freigegebenen KMP-Moduls definieren. Wenn Sie diese Klassen in gemeinsamen Quellen platzieren, können sie auf allen Zielplattformen freigegeben werden. Mit actual- und expect-Deklarationen können Sie platformspezifische Implementierungen erstellen.

DataStore-Instanz erstellen

Sie müssen festlegen, wie das DataStore-Objekt auf jeder Plattform instanziiert werden soll. Dies ist der einzige Teil der API, der aufgrund der Unterschiede bei den Dateisystem-APIs in den Quellsätzen der jeweiligen Plattform enthalten sein muss.

Verbreitet

// 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

Zum Erstellen der DataStore-Instanz benötigen Sie eine Context sowie den Dateipfad.

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

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

iOS

Zum Erstellen der DataStore-Instanz benötigen Sie eine DataStore-Factory und den DataStore-Pfad.

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