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