DataStore (Kotlin Multiplatform)

ספריית DataStore מאחסנת נתונים באופן אסינכרוני, עקבי לעסק, להתגבר על חלק מהחסרונות של SharedPreferences. הזה להתמקד ביצירת DataStore בפרויקטים של Kotlin Multiplatform (KMP). למידע נוסף על DataStore, אפשר לעיין במאמר מסמכי תיעוד ראשיים של DataStore ודוגמאות רשמיות.

הגדרת יחסי תלות

DataStore תומך ב-KMP בגרסאות 1.1.0 ואילך.

כדי להגדיר את DataStore בפרויקט KMP, צריך להוסיף את יחסי התלות של פריטי המידע שנוצרו בתהליך הפיתוח (Artifact) בקובץ build.gradle.kts של המודול:

  • androidx.datastore:datastore - ספריית DataStore
  • androidx.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"
    }
)