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