DataStore (Multiplatform Kotlin)

کتابخانه DataStore داده ها را به صورت ناهمزمان، پیوسته و به صورت تراکنشی ذخیره می کند و بر برخی از اشکالات SharedPreferences غلبه می کند. این صفحه بر ایجاد DataStore در پروژه های چند پلتفرمی Kotlin (KMP) تمرکز دارد. برای اطلاعات بیشتر در مورد DataStore، به اسناد اولیه برای DataStore و نمونه‌های رسمی مراجعه کنید.

راه اندازی وابستگی ها

DataStore از KMP در نسخه های 1.1.0 و بالاتر پشتیبانی می کند.

برای راه اندازی DataStore در پروژه KMP خود، وابستگی های مصنوعات را در فایل build.gradle.kts برای ماژول خود اضافه کنید:

  • androidx.datastore:datastore - کتابخانه DataStore
  • androidx.datastore:datastore-preferences - کتابخانه 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"

اندروید

برای ایجاد نمونه 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"
    }
)