کتابخانه 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"
}
)