DataStore (Kotlin Multiplatform)

تقوم مكتبة 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 - مكتبة 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"
    }
)