ספריית DataStore מאחסנת נתונים באופן אסינכרוני, עקבי לעסק, להתגבר על חלק מהחסרונות של SharedPreferences. הזה להתמקד ביצירת DataStore בפרויקטים של Kotlin Multiplatform (KMP). למידע נוסף על DataStore, אפשר לעיין במאמר מסמכי תיעוד ראשיים של DataStore ודוגמאות רשמיות.
הגדרת יחסי תלות
DataStore תומך ב-KMP בגרסאות 1.1.0 ואילך.
כדי להגדיר את DataStore בפרויקט KMP, צריך להוסיף את יחסי התלות של פריטי המידע שנוצרו בתהליך הפיתוח (Artifact)
בקובץ 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 צריך מפעל למסד נתונים, יחד עם הנתיב של מסד הנתונים.
// 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"
}
)