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