ספריית DataStore מאחסנת נתונים באופן אסינכרוני, עקבי וטרנזקציונלי, ומתגברת על חלק מהחסרונות של SharedPreferences. בדף הזה מוסבר איך יוצרים DataStore בפרויקטים של Kotlin Multiplatform (KMP). למידע נוסף על DataStore, קראו את המסמכים הראשיים של DataStore.
הגדרת יחסי תלות
כדי להגדיר את DataStore בפרויקט KMP, מוסיפים את יחסי התלות של פריטי המידע שנוצר בקובץ build.gradle.kts של המודול:
commonMain.dependencies {
// DataStore library
implementation("androidx.datastore:datastore-core:1.3.0")
// The Preferences DataStore library
implementation("androidx.datastore:datastore-preferences-core:1.3.0")
}
הגדרת המחלקות של DataStore
אפשר להגדיר את המחלקה DataStore באמצעות DataStoreFactory בתוך המקור המשותף של מודול ה-KMP המשותף. הצבת המחלקות האלה במקורות משותפים מאפשרת לשתף אותן בכל פלטפורמות היעד. אתם יכולים להשתמש בהצהרות actual ו-expect כדי ליצור הטמעות ספציפיות לפלטפורמה.
יצירת המכונה של DataStore
צריך להגדיר איך ליצור מופע של אובייקט DataStore בכל פלטפורמה. זהו החלק היחיד ב-API שצריך להיות בקבוצות המקורות של הפלטפורמה הספציפית, בגלל ההבדלים בממשקי ה-API של מערכת הקבצים.
נפוץ
// shared/src/commonMain/kotlin/createDataStore.kt
/**
* Gets the singleton DataStore instance, creating it if necessary.
*/
fun createDataStore(storage: Storage<Preferences>): DataStore<Preferences> =
DataStoreFactory.create(storage = storage)
internal const val dataStoreFileName = "dice.preferences_pb"
Android
כדי ליצור את המכונה של DataStore ב-Android, צריך Context יחד עם הנתיב.
// shared/src/androidMain/kotlin/createDataStore.android.kt
fun createDataStore(): DataStore<Preferences> = createDataStore(
storage = FileStorage(
serializer = PreferencesFileSerializer,
produceFile = { context.filesDir.resolve(dataStoreFileName) }
)
)
iOS
ב-iOS, אפשר לאחזר את הנתיב מה-NSDocumentDirectory:
// shared/src/iosMain/kotlin/createDataStore.ios.kt
fun createDataStore(): DataStore<Preferences> = createDataStore(
storage = OkioStorage(
fileSystem = FileSystem.SYSTEM,
serializer = PreferencesSerializer,
producePath = {
val documentDirectory: NSURL? = NSFileManager.defaultManager.URLForDirectory(
directory = NSDocumentDirectory,
inDomain = NSUserDomainMask,
appropriateForURL = null,
create = false,
error = null,
)
(requireNotNull(documentDirectory).path + "/$dataStoreFileName").toPath()
}
)
)
אינטרנט
כדי ליצור את המכונה של DataStore באינטרנט, אפשר להשתמש ב-WebLocalStorage או ב-WebSessionStorage:
// shared/src/jsMain/kotlin/createDataStore.web.kt (also works for wasmJsMain)
fun createDataStore(): DataStore<Preferences> = createDataStore(
storage = WebLocalStorage(
serializer = PreferencesSerializer,
name = dataStoreFileName
)
)
JVM (מחשב)
כדי ליצור את המכונה DataStore ב-JVM (מחשב), צריך לספק נתיב באמצעות ממשקי API של Java או Kotlin:
// shared/src/jvmMain/kotlin/createDataStore.desktop.kt
fun createDataStore(): DataStore<Preferences> = createDataStore(
storage = FileStorage(
serializer = PreferencesFileSerializer,
produceFile = { File(System.getProperty("java.io.tmpdir"), dataStoreFileName) }
)
)