הספרייה DataStore מאחסנת נתונים באופן אסינכרוני, עקבי וטרנזקציונלי, וכך היא מתגברת על חלק מהחסרונות של SharedPreferences. בדף הזה נתמקד ביצירת DataStore בפרויקטים של Kotlin Multiplatform (KMP). למידע נוסף על DataStore, אפשר לעיין במסמכי התיעוד העיקריים של DataStore ובדוגמאות רשמיות.
הגדרת יחסי תלות
כדי להגדיר את DataStore בפרויקט KMP, מוסיפים את התלות בארטיפקטים בקובץ build.gradle.kts של המודול:
commonMain.dependencies {
// DataStore library
implementation("androidx.datastore:datastore:1.1.7")
// The Preferences DataStore library
implementation("androidx.datastore:datastore-preferences:1.1.7")
}
הגדרת המחלקות של 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(producePath: () -> String): DataStore<Preferences> =
PreferenceDataStoreFactory.createWithPath(
produceFile = { producePath().toPath() }
)
internal const val dataStoreFileName = "dice.preferences_pb"
Android
כדי ליצור את מופע DataStore ב-Android, צריך Context ואת הנתיב.
// shared/src/androidMain/kotlin/createDataStore.android.kt
fun createDataStore(context: Context): DataStore<Preferences> = createDataStore(
producePath = { context.filesDir.resolve(dataStoreFileName).absolutePath }
)
iOS
ב-iOS, אפשר לאחזר את הנתיב מ-NSDocumentDirectory:
// shared/src/iosMain/kotlin/createDataStore.ios.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"
}
)
JVM (מחשב)
כדי ליצור את מופע DataStore ב-JVM (במחשב), צריך לספק נתיב באמצעות ממשקי Java או Kotlin API:
// shared/src/jvmMain/kotlin/createDataStore.desktop.kt
fun createDataStore(): DataStore<Preferences> = createDataStore(
producePath = {
val file = File(System.getProperty("java.io.tmpdir"), dataStoreFileName)
file.absolutePath
}
)