DataStore مقابل SharedPreferences
تعرّف إلى سبب كون DataStore الخيار العصري
DataStore مقابل SharedPreferences درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 4 دروس في المجموع.
تخزين الإعدادات الصغيرة
تحتاج كل التطبيقات تقريبًا إلى تذكّر أجزاء صغيرة من البيانات: مفتاح الوضع الداكن، وعلامة التبويب المستخدمة أخيرًا، واسم المستخدم. وهذه تفضيلات مفتاح-قيمة وليست بيانات علائقية كبيرة.
استخدم Android لسنوات SharedPreferences لهذا الغرض. أما اليوم فالحل الموصى به هو DataStore.
ما هي SharedPreferences؟
إن SharedPreferences مخزن بسيط لمفتاح-قيمة تدعمه ملفات XML. تحصل على محرر، وتضع القيم، ثم تثبتها.
- سهلة الاستخدام
- مدمجة في الإطار
- واجهة برمجة متزامنة يمكن أن تحجب مؤشر واجهة المستخدم
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
prefs.edit().putBoolean("dark_mode", true).apply()
val dark = prefs.getBoolean("dark_mode", false)مشكلات SharedPreferences
لدى SharedPreferences نقاط ضعف حقيقية:
- يمكن لقراءات
getX()حجب الخيط المستدعي (وغالبًا ما يكون الخيط الرئيسي) - ينفذ
commit()عمليات إدخال وإخراج على القرص بشكل متزامن - لا توجد طريقة مدمجة للإبلاغ عن الأخطاء
- الواجهة غير آمنة من ناحية الأنواع وغير تفاعلية
استخدام DataStore
إن DataStore البديل الحديث المبني على coroutines وFlow في Kotlin. وهو ينفذ جميع أعمال القرص خارج الخيط الرئيسي، ويعرض البيانات كتدفق قابل للمراقبة.
له نوعان: Preferences DataStore (مفتاح-قيمة) وProto DataStore (كائنات ذات أنواع).
غير متزامن بطبيعته
لا يحجب DataStore واجهة المستخدم مطلقًا. تصل القراءات عبر Flow تجمعه، وتكون عمليات الكتابة دوال suspend تستدعيها من coroutine.
وهذا يعني أن قراءة الإعدادات وكتابتها آمنتان حتى على الخيط الرئيسي، لأن العمل المكثف يُنفذ على موزّع في الخلفية.
val darkMode: Flow<Boolean> = dataStore.data
.map { prefs -> prefs[DARK_MODE_KEY] ?: false }التحديثات التفاعلية
بما أن DataStore يعرض Flow، تُحدّث واجهة المستخدم تلقائيًا عند تغير قيمة. أما مع SharedPreferences، فكان يتعين عليك تسجيل مستمع تغيير غير عملي.
في Jetpack Compose، ما عليك سوى استخدام collectAsState() لجمع التدفق، وستُعاد composition للشاشة عند كل تحديث.
ذرّي ومتسق
تكون عمليات الكتابة في DataStore ذرّية. فإما أن ينجح التحديث بالكامل أو يفشل بالكامل، ولذلك لن تقرأ قيمة مكتوبة جزئيًا.
كما يضمن اتساق البيانات عبر عمليات القراءة والكتابة المتعددة ضمن العملية نفسها.
معالجة الأخطاء
يتجاهل SharedPreferences مشكلات الإدخال والإخراج بصمت. أما DataStore فيُظهرها: يمكن للقراءة أن تُصدر IOException عبر التدفق، ويمكنك التقاطها باستخدام catch والتعافي منها.
val settings: Flow<Settings> = dataStore.data
.catch { e ->
if (e is IOException) emit(emptyPreferences())
else throw e
}
.map { /* map to your model */ }متى لا يكون DataStore هو الحل؟
يُستخدم DataStore للبيانات الصغيرة أو المتوسطة من نوع مفتاح-قيمة أو ذات الأنواع المحددة. وهو ليس قاعدة بيانات.
- مجموعات البيانات الكبيرة والاستعلامات والعلاقات: استخدم Room
- الملفات والصور والوسائط: استخدم نظام الملفات
- عدد قليل من الإعدادات: استخدم DataStore
إضافة الاعتمادية
لاستخدام Preferences DataStore، أضف الـ artifact إلى ملف Gradle الخاص بالوحدة. يوجد artifact منفصل لـ Proto DataStore.
dependencies {
implementation("androidx.datastore:datastore-preferences:1.1.1")
}الترحيل من SharedPreferences
لا يتعين عليك إعادة كتابة كل شيء دفعة واحدة. يوفّر DataStore SharedPreferencesMigration لنسخ القيم الحالية تلقائيًا عند أول قراءة.
val Context.dataStore by preferencesDataStore(
name = "settings",
produceMigrations = { context ->
listOf(SharedPreferencesMigration(context, "settings"))
}
)اختبار سريع
اختبر مدى فهمك لسبب تفضيل DataStore.
مراجعة
تعلّمت لماذا يُعد DataStore الخيار الحديث لإعدادات المفتاح والقيمة:
- يمكن لـ SharedPreferences حظر الخيط الرئيسي، كما أنه لا يتفاعل تلقائيًا مع التغييرات
- يستخدم DataStore الـ coroutines و
Flowللوصول غير المتزامن الآمن - تتم عمليات الكتابة ضمن معاملات مع معالجة مناسبة للأخطاء
- يوجد نوعان: Preferences وProto
بعد ذلك ستستخدم delegate preferencesDataStore عمليًا.
الأسئلة الشائعة
هل درس «DataStore مقابل SharedPreferences» مجاني؟
نعم — نص درس «DataStore مقابل SharedPreferences» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 4 دروس في المجموع.
ماذا ستتعلم في «DataStore مقابل SharedPreferences»؟
تعرّف إلى سبب كون DataStore الخيار العصري تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟
لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «DataStore مقابل SharedPreferences»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟
نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- DataStore مقابل SharedPreferences
- Preferences DataStore
- قراءة الإعدادات وكتابتها
- Proto DataStore