DataStore (Kotlin Multiplatform)

Die DataStore-Bibliothek speichert Daten asynchron, einheitlich und transaktional und überwindet damit einige Nachteile von SharedPreferences. Dieses konzentriert sich auf das Erstellen von DataStore in KMP-Projekten (Kotlin Multiplatform). Weitere Informationen zu DataStore finden Sie in der primäre Dokumentation für DataStore und offizielle Beispiele.

Abhängigkeiten einrichten

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

Fügen Sie die Abhängigkeiten für die Artefakte hinzu, um DataStore in Ihrem KMP-Projekt einzurichten in der Datei build.gradle.kts für Ihr Modul:

  • androidx.datastore:datastore – DataStore-Bibliothek
  • androidx.datastore:datastore-preferences – DataStore-Bibliothek für Einstellungen

DataStore-Klassen definieren

Sie können die DataStore-Klasse mit DataStoreFactory im gemeinsamen Quelle des freigegebenen KMP-Moduls. Diese Klassen in gemeinsamen Quellen platzieren können sie auf allen Zielplattformen verwendet werden. Sie können Zu erstellende actual- und expect-Deklarationen plattformspezifischen Implementierungen.

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 auf der jeweiligen Plattform vorhanden sein muss Quellsätzen aufgrund der Unterschiede zwischen Dateisystem-APIs.

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 ein Context sowie die 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 der 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"
    }
)