ספריית DataStore מאחסנת נתונים באופן אסינכרוני, עקבי ועסקאותי, ומאפשרת להתגבר על חלק מהחסרונות של SharedPreferences. בדף הזה נסביר איך יוצרים מאגר נתונים בפרויקטים של Kotlin Multiplatform (KMP). למידע נוסף על DataStore, אפשר לעיין במסמכי העזרה הראשיים של DataStore ובדוגמאות הרשמיות.
הגדרת יחסי תלות
DataStore תומך ב-KMP בגרסה 1.1.0 ואילך.
כדי להגדיר את DataStore בפרויקט KMP, מוסיפים את יחסי התלות של הארטיפקטים בקובץ build.gradle.kts
של המודול:
androidx.datastore:datastore
– ספריית DataStoreandroidx.datastore:datastore-preferences
– הספרייה של DataStore של ההעדפות
הגדרת הכיתות של DataStore
אפשר להגדיר את הכיתה DataStore
באמצעות DataStoreFactory
בתוך המקור המשותף של מודול ה-KMP המשותף. הצבת הכיתות האלה במקורות משותפים מאפשרת לשתף אותן בכל פלטפורמות היעד. אפשר להשתמש בהצהרות actual
ו-expect
כדי ליצור הטמעות ספציפיות לפלטפורמה.
יצירת המכונה של DataStore
צריך להגדיר איך ליצור מופע של אובייקט DataStore בכל פלטפורמה. זהו החלק היחיד ב-API שצריך להופיע בקבוצות המקור הספציפיות של הפלטפורמה, בגלל ההבדלים בממשקי ה-API של מערכת הקבצים.
נפוץ
// 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
כדי ליצור את המכונה DataStore
, צריך Context
יחד עם נתיב הקובץ.
// shared/src/androidMain/kotlin/createDataStore.android.kt
fun createDataStore(context: Context): DataStore<Preferences> = createDataStore(
producePath = { context.filesDir.resolve(dataStoreFileName).absolutePath }
)
iOS
כדי ליצור את מופע DataStore, צריך מפעל DataStore יחד עם הנתיב של DataStore.
// 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"
}
)