تخزن مكتبة DataStore البيانات بشكل غير متزامن ومتسق وعلى مستوى المعاملات، مما يتغلب على بعض العيوب في SharedPreferences. تركّز هذه الصفحة على إنشاء DataStore في مشاريع Kotlin Multiplatform (KMP). لمزيد من المعلومات حول DataStore، يمكنك الاطّلاع على المستندات الأساسية الخاصة بأداة DataStore والنماذج الرسمية.
إعداد التبعيات
يدعم DataStore تطبيق KMP في الإصدارات 1.1.0 والإصدارات الأحدث.
لإعداد DataStore في مشروع KMP، أضف التبعيات للعناصر
في ملف build.gradle.kts
للوحدة النمطية الخاصة بك:
- "
androidx.datastore:datastore
" - مكتبة DataStore androidx.datastore:datastore-preferences
- مكتبة DataStore المفضّلة
تعريف فئات DataStore
يمكنك تحديد الفئة DataStore
باستخدام DataStoreFactory
داخل المصدر المشترك في وحدة KMP المشتركة. يسمح وضع هذه الفئات في مصادر مشتركة
بمشاركتها عبر جميع الأنظمة الأساسية المستهدفة. يمكنك استخدام بيانَي actual
وexpect
لإنشاء عمليات تنفيذ خاصة بالنظام الأساسي.
إنشاء مثيل DataStore
تحتاج إلى تحديد كيفية إنشاء مثيل لكائن DataStore على كل نظام أساسي. وهذا هو الجزء الوحيد من واجهة برمجة التطبيقات المطلوب أن يكون ضمن مجموعات مصادر محدّدة للنظام الأساسي بسبب الاختلافات في واجهات برمجة التطبيقات لنظام الملفات.
الإعدادات الشائعة
// 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"
}
)