يعد تخزين البيانات من المهام الرئيسية لأي تطبيق محمول، حيث يؤثر على الأداء والأمان وتجربة المستخدم. في هذه المقالة سوف نتناول SQLite وRoom وCore Data وRealm وFirebase Firestore وSharedPreferences وDataStore وKeystore وKeychain، بالإضافة إلى تنسيقات التسلسل (JSON وProtobuf) والمكتبات (Gson وMoshi وkotlinx.serialization). سيساعد هذا الدليل المطورين المبتدئين في اختيار حل تخزين البيانات المناسب. للمزيد، راجع الدليل الرسمي لنظام Android حول تخزين البيانات.
أهم النقاط
لتخزين البيانات المنظمة ذات العلاقات بين الكيانات، يتم استخدام قواعد البيانات العلائقية.
SQLite هي قاعدة بيانات علائقية مضمنة تعمل على أي منصة محمولة. لا تتطلب خادماً منفصلاً، ويتم تخزين البيانات في ملف واحد. SQLite هي الأساس لـ Room (Android) واختيارياً لـ Core Data (iOS). المكتبات: android.database.sqlite (Android)، FMDB/Core Data (iOS)، sqflite (Flutter).
Room هي المكتبة الرسمية لمكونات Android Architecture Components للعمل مع SQLite. توفر طبقة ORM: Entity (جدول)، DAO (استعلامات)، Database (نقطة دخول). يتحقق Room من استعلامات SQL في وقت الترجمة، ويدعم coroutines وFlow، ويهاجر المخطط تلقائياً.
@Entity data class User( @PrimaryKey val id: Int, val name: String, val email: String ) @Dao interface UserDao { @Query("SELECT * FROM user WHERE id = :id") suspend fun getUser(id: Int): User? }
Core Data هو إطار عمل Apple لإدارة رسم بياني للكائنات. إنها ليست قاعدة بيانات نقية — بل هي طبقة استمرارية فوق SQLite أو XML أو التخزين الثنائي. يدير Core Data الكائنات (NSManagedObject) والعلاقات وإصدار المخطط والتراجع/الإعادة والعمل متعدد الخيوط عبر NSManagedObjectContext.
Realm هو بديل لـ SQLite، مصمم كقاعدة بيانات محمولة عالية الأداء. Realm أسرع من SQLite في القراءة والكتابة، وتدعم الإشعارات التفاعلية (Live Objects)، والتشفير أثناء التنقل، والعمل عبر المنصات (Android وiOS وFlutter وReact Native). العيوب: زيادة حجم APK/IPA واستهلاك أكبر للذاكرة.
لتخزين كميات صغيرة من البيانات (الإعدادات والرموز وذاكرة التخزين المؤقت)، يتم استخدام مخازن بسيطة لأزواج المفتاح-القيمة.
SharedPreferences هو مخزن قديم لأزواج المفتاح-القيمة في Android. السلبيات: وصول متزامن (يُعطل واجهة المستخدم عند القراءة)، وعدم وجود كتابة، وخطر ANR عند تحميل ملف كبير. غير موصى به للمشاريع الجديدة.
DataStore هو البديل الحديث لـ SharedPreferences من Google. يعمل بشكل غير متزامن عبر Kotlin Coroutines وFlow، ويدعم Preferences DataStore (مفتاح-قيمة) وProto DataStore (بيانات بنمط محدد عبر Protobuf). DataStore آمن لخيط واجهة المستخدم ويدعم المعاملات.
UserDefaults هو المخزن القياسي للإعدادات الصغيرة في iOS. يدعم الأنواع البدائية والسلاسل والتواريخ وData. UserDefaults متزامن، لذلك فهو غير مناسب للكميات الكبيرة من البيانات. تسجيل القيم عبر register(defaults:) يحدد القيم الافتراضية.
لتخزين البيانات في التطبيقات التي تتطلب مزامنة بين الأجهزة، يتم استخدام قواعد بيانات Firebase السحابية.
Firebase Firestore هي قاعدة بيانات مستندات NoSQL مع اشتراكات في الوقت الفعلي وتوسع تلقائي واستعلامات قوية ووضع عدم اتصال مدمج. يتم تنظيم البيانات في مجموعات ومستندات (هياكل تشبه JSON). تدعم Firestore المعاملات والعمليات الدفعية. مثالية للدردشات والخلاصات والتطبيقات الاجتماعية.
Firebase Realtime Database هي قاعدة بيانات NoSQL أقدم من Firebase تخزن البيانات كشجرة JSON واحدة. أبسط من Firestore ولكنها أقل مرونة في الاستعلامات والتوسع. موصى بها للتطبيقات البسيطة في الوقت الفعلي (الحالة عبر الإنترنت والدردشات البسيطة).
| الميزة | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| نموذج البيانات | مجموعات → مستندات | شجرة JSON |
| الاستعلامات | معقدة (تصفية وترتيب وحدود) | بسيطة (حسب المفتاح) |
| التوسع | تلقائي | تقسيم يدوي |
| وضع عدم الاتصال | نعم (ذاكرة تخزين مؤقت مستمرة) | نعم |
| السعر | حسب عمليات القراءة/الكتابة | حسب حركة المرور + التخزين |
يتطلب تخزين الرموز وكلمات المرور ومفاتيح التشفير مخازن محمية خاصة.
Android Keystore هو مخزن نظام للمفاتيح التشفيرية. يتم تخزين المفاتيح في بيئة أجهزة (TEE — Trusted Execution Environment) غير قابلة للوصول للتطبيقات ونظام التشغيل. يدعم إنشاء المفاتيح والتشفير والتوقيع. مع Android 9+ يتضمن StrongBox Keymaster (شريحة مخصصة).
Keychain Services هو مخزن آمن في iOS لكلمات المرور والمفاتيح والشهادات. يتم تشفير البيانات باستخدام Secure Enclave للأجهزة. يدعم Keychain مستويات الوصول: Always وWhenUnlocked وWhenUnlockedThisDeviceOnly وAfterFirstUnlock.
EncryptedSharedPreferences هو غلاف حول SharedPreferences مع تشفير المفاتيح والقيم باستخدام AES256-GCM وHKDF. تم تنفيذه في مكتبة AndroidX Security. موصى به لتخزين الرموز والإعدادات الحساسة.
في IT Sectr نستخدم Android Keystore + EncryptedSharedPreferences لتخزين رموز التحديث والمفاتيح البيومترية. على iOS نستخدم Keychain بمستوى kSecAttrAccessibleWhenUnlockedThisDeviceOnly لأقصى درجات الأمان.
لتخزين الملفات (الصور والفيديو والمستندات)، توفر المنصات المحمولة عدة أنواع من التخزين.
يميز Android بين Internal Storage (/data/data/package/ — تخزين خاص) وExternal Storage (بطاقة SD أو قسم محاكى). Cache Directory هو تخزين مؤقت يمكن للنظام تنظيفه. Scoped Storage (Android 10+) يقيد الوصول إلى External Storage — حيث ترى التطبيقات ملفاتها الخاصة فقط أو الملفات عبر MediaStore/SAF.
يوفر iOS Documents Directory (نسخ احتياطي لـ iCloud وبيانات دائمة) وLibrary/Caches (ملفات مؤقتة لا يتم نسخها احتياطياً) وTmp Directory (مؤقتة ويمكن تنظيفها). استخدم NSFileManager للعمل مع نظام الملفات. iOS 11+ يدعم File Provider للملفات السحابية.
التسلسل هو تحويل الكائنات إلى تنسيق للإرسال أو التخزين. إلغاء التسلسل هو العملية العكسية.
JSON (JavaScript Object Notation) هو التنسيق الأكثر شيوعاً: قابل للقراءة ومرن ومدعوم من جميع المنصات. XML أكثر صرامة ويستخدم في الأنظمة القديمة. Protobuf (Protocol Buffers) هو تنسيق ثنائي من Google: أكثر إحكاما من JSON بمقدار 3-10 مرات، ويُحلل بشكل أسرع، وله مخطط صارم. يُستخدم للأنظمة عالية التحميل والخدمات المصغرة.
JSONSerialization هي API مضمنة للعمل مع JSON. Codable (Encodable/Decodable) هو بروتوكول Swift حديث للتسلسل التلقائي إلى JSON وProperty List والتنسيقات الأخرى.
struct User: Codable { let id: Int let name: String let email: String } let user = User(id: 1, name: "Alice", email: "alice@example.com") let encoder = JSONEncoder() let jsonData = try encoder.encode(user)
توجد مكتبات تخزين فعالة خاصة بـ Flutter وReact Native.
Hive هو مخزن مفتاح-قيمة خفيف وسريع لـ Flutter. لا يتطلب كوداً أصلياً (Dart نقي)، ويدعم الكتابة عبر TypeAdapter، ويعمل في isolates. مثالي لذاكرة التخزين المؤقت والإعدادات والكميات الصغيرة من البيانات.
ObjectBox هي قاعدة بيانات مضمنة عالية الأداء لـ Flutter وAndroid وiOS. أسرع من SQLite بأكثر من 10 مرات، وتستخدم هيكل ملفات مسطح لأقل حمل إضافي. تدعم العلاقات والاستعلامات والاشتراكات التفاعلية (ObjectBox Dart).
Drift هي مكتبة SQLite تفاعلية لـ Flutter وDart. توفر استعلامات آمنة من حيث النوع وهجرات ووظائف DAO ودعم Stream (تحديثات تفاعلية). Drift هو الخيار الأساسي لمشاريع Flutter التي تتطلب SQLite.
الأسئلة الشائعة
الاختيار يعتمد على المنصة: Room (Android) هي المكتبة الرسمية القائمة على SQLite مع التحقق من الاستعلامات في وقت الترجمة. Core Data (iOS) هو إطار عمل Apple مع رسم بياني للكائنات. للمشاريع عبر المنصات، فإن Realm أو SQLite عبر ORM مناسب.
SharedPreferences هو تطبيق قديم مع وصول متزامن وخطر ANR. DataStore (Jetpack) هو بديل حديث يعتمد على Kotlin Coroutines وFlow، ويدعم عدم التزامن والكتابة والحماية من الأخطاء.
Android: EncryptedSharedPreferences أو Android Keystore. iOS: Keychain Services بمستوى وصول WhenUnlockedThisDeviceOnly. للبيانات الحرجة، استخدم Secure Enclave (iOS) وKeystore الأجهزة (Android) مع القياسات الحيوية.
Cloud Firestore هي قاعدة بيانات NoSQL من Firebase مع مزامنة في الوقت الفعلي ووضع عدم الاتصال وتوسع تلقائي. مناسبة للدردشات وخلاصات الأخبار والمشاريع التي تحتاج إلى مزامنة بين الأجهزة.
Flutter: Hive (مفتاح-قيمة سريع)، Floor (ORM SQLite)، Drift (Moor، SQLite تفاعلي)، ObjectBox (قاعدة بيانات مضمنة عالية الأداء). React Native: Realm وWatermelonDB (تحميل كسول) وAsyncStorage (مشابه لـ SharedPreferences).
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.