DataStore (Kotlin Multiplatform)

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

Abhängigkeiten einrichten

DataStore unterstützt KMP ab den Versionen 1.1.0.

Fügen Sie zum Einrichten von DataStore in Ihrem KMP-Projekt die Abhängigkeiten für die Artefakte in die Datei build.gradle.kts für Ihr Modul ein:

  • androidx.datastore:datastore – Datastore-Bibliothek
  • androidx.datastore:datastore-preferences – Die Datastore-Bibliothek „Einstellungen“

DataStore-Klassen definieren

Sie können die Klasse DataStore 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 gemeinsam genutzt werden. Mit den Deklarationen actual und expect lassen sich plattformspezifische Implementierungen erstellen.

DataStore-Instanz erstellen

Sie müssen für jede Plattform festlegen, wie das Datastore-Objekt instanziiert wird. Dies ist der einzige Teil der API, der aufgrund der Unterschiede bei den Dateisystem-APIs in den jeweiligen Plattformquellsätzen 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 Instanz DataStore benötigen Sie einen Context zusammen mit dem 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 Datenbank-Factory zusammen mit dem Datenbankpfad.

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