ثبات البيانات في التطوير المحمول — ما هو، الطرق وكيف يعمل

المؤلف: IT Sectr نُشر: 2026-03-14 وقت القراءة: 8 دق

يضمن ثبات البيانات الحفاظ على معلومات المستخدم بين جلسات تطبيق الهاتف المحمول. بدون هذه التقنية، كل تشغيل سيبدأ من الصفر — الإعدادات، والسجل والملفات المحملة ستفقد عند الإغلاق. وفقًا لـ Google Developers, 2024، أكثر من 90% من التطبيقات المحمولة تستخدم على الأقل آلية واحدة للثبات للحفاظ على بيانات المستخدم وحالة الواجهة.

النقاط الرئيسية

  • Data Persistence — آليات الحفاظ على البيانات بين جلسات التطبيق
  • SharedPreferences — تخزين أزواج بسيطة من نوع مفتاح-قيمة على Android
  • SQLite — قاعدة بيانات علاقاتية مضمنة للأجهزة المحمولة
  • Room — طبقة ORM فوق SQLite من Google لـ Android
  • Core Data — إطار إدارة الكائنات على iOS و macOS

ما هو ثبات البيانات

Data Persistence هي قدرة التطبيق على حفظ البيانات في الذاكرة غير المتطايرة للجهاز. في التطوير المحمول، يشمل الثبات قواعد البيانات، ونظام الملفات، والإعدادات والذاكرة المؤقتة. لكل آلية خصائصها الخاصة من حيث الأداء والأمان وسعة التخزين.

البيانات المؤقتة والدائمة

البيانات المؤقتة توجد فقط في الذاكرة العشوائية وتفقد عند إنهاء العملية. تشمل حالة الشاشة، والحسابات المؤقتة وذاكرة الصور المؤقتة. البيانات الدائمة تُكتب في نظام الملفات أو قاعدة بيانات وتبقى متاحة بعد إعادة تشغيل التطبيق. تشمل إعدادات المستخدم، ورموز التفويض، وسجل العمليات والمحتوى المحمل.

معايير اختيار آلية التخزين

عند اختيار طريقة التخزين، يقيم المطورون عدة عوامل. يحدد نوع البيانات هيكل التخزين: الإعدادات البسيطة — SharedPreferences أو DataStore، السجلات المنظمة — SQLite أو Room، الملفات — File Storage. يؤثر حجم البيانات على الأداء: قواعد البيانات محسنة لآلاف السجلات، بينما الملفات مناسبة للكائنات الثنائية الكبيرة. يتطلب الأمان تشفير المعلومات الحساسة من خلال EncryptedSharedPreferences أو SQLCipher.

kotlin
data class StorageOption(
    name: String,
    dataType: StorageType,
    capacity: Long,
    secure: Boolean
)

enum class StorageType {
    KEY_VALUE,
    RELATIONAL,
    FILE
}

SharedPreferences و DataStore

SharedPreferences هي الطريقة التقليدية لتخزين أزواج المفتاح-القيمة على Android. هذه الواجهة البرمجية متاحة منذ الإصدارات الأولى للمنصة وتدعم الأنواع الأولية: النصوص، الأرقام والقيم البولية. تخزن البيانات في ملف XML في دليل خاص بالتطبيق ولا تكون متاحة إلا لعمليته.

DataStore كبديل

Jetpack DataStore هو بديل حديث لـ SharedPreferences مبني على Kotlin Coroutines و Flow. يقدم DataStore نمطين: Preferences DataStore للقيم البسيطة و Proto DataStore للكائنات المقيدة. على عكس SharedPreferences، يضمن DataStore اتساق البيانات تحت الوصول المتزامن ويدعم العمليات غير المتزامنة دون حجب الخيط الرئيسي.

kotlin
// SharedPreferences — النهج التقليدي
val prefs = context
    .getSharedPreferences("settings", Context.MODE_PRIVATE)
with (prefs.edit()) {
    putString("username", "john_doe")
    putInt("score", 1500)
    apply()
}

// DataStore — النهج غير المتزامن
val settingsDataStore = context
    .createDataStore("settings.pb")

val usernameFlow: Flow<String> = settingsDataStore
    .data
    .map { it[USERNAME_KEY] ?: "" }

على iOS، المكافئ لـ SharedPreferences هو UserDefaults، نظام تخزين القيم البسيطة بتنسيق Property List. يستخدم UserDefaults الوصول المتزامن ويناسب لكميات صغيرة من بيانات التهيئة، ولكنه لا يوصى به لتخزين المعلومات الحساسة.

SQLite في التطبيقات المحمولة

SQLite هي قاعدة بيانات علاقاتية مضمنة تعمل داخل عملية التطبيق دون خادم منفصل. هي أكثر نظام إدارة قواعد البيانات انتشارًا في التطوير المحمول: تستخدم افتراضيًا على كلتا المنصتين. تضمن Android SQLite في SDK، ويضمنها iOS في مكتبة libsqlite3. تدعم SQLite SQL القياسي، والمعاملات، والفهارس والمحفزات.

إنشاء جدول وعمليات CRUD

يبدأ العمل مع SQLite بتعريف مخطط قاعدة البيانات. يحدد المطور الجداول وحقولها وأنواعها، ثم ينفذ عمليات الإدراج والقراءة والتحديث والحذف. يدير SQLiteOpenHelper على Android إنشاء قاعدة البيانات وترحيلاتها، بينما يستخدم iOS واجهة C أو غلاف FMDB.

kotlin
// SQLiteOpenHelper على Android
class DBHelper(context: Context) :
    SQLiteOpenHelper(context, "app.db", null, 1) {

    override fun onCreate(db: SQLiteDatabase) {
        db.execSQL("""
            CREATE TABLE users (
                id INTEGER PRIMARY KEY,
                name TEXT NOT NULL,
                email TEXT UNIQUE
            )
        """)
    }

    fun insertUser(name: String, email: String) {
        val db = writableDatabase
        val values = ContentValues().apply {
            put("name", name)
            put("email", email)
        }
        db.insert("users", null, values)
    }
}
نوع البياناتSharedPreferencesSQLiteنظام الملفات
النوعمفتاح-قيمةقاعدة علاقاتيةملفات ثنائية
الحجممئات السجلاتآلاف السجلاتالمساحة المتاحة
الأداءعاليمتوسطيعتمد على الحجم
الاستخدام النموذجيإعداداتبيانات منظمةصور، فيديو

Room — ORM لـ Android

Room هي مكتبة من Jetpack توفر طبقة ORM فوق SQLite. تلغي Room العمل المتكرر لكتابة استعلامات SQL و ContentValues، وتستبدلهما بالشروحات ودوال Kotlin. يقوم مجمع Room بتوليد تطبيقات DAO (Data Access Object) أثناء البناء، مما يلغي أخطاء نحو SQL.

إعداد Room في مشروع

لتكامل Room، من الضروري إضافة تبعية kapt ووسم فئة الكيان، واجهة DAO وفئة قاعدة البيانات. تعمل RoomDatabase كنقطة دخول: يتم الحصول على DAO من خلالها وتنفيذ عمليات قاعدة البيانات. تدعم Room Flow للاستعلامات التفاعلية، وترحيل المخطط والتحقق من الاستعلامات أثناء البناء.

kotlin
@Entity(tableName = "users")
data class User(
    @PrimaryKey val id: Int,
    @ColumnInfo(name = "full_name") val name: String,
    @ColumnInfo val email: String
)

@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    fun getAll(): Flow<List<User>>

    @Insert
    suspend fun insert(user: User)

    @Delete
    suspend fun delete(user: User)
}

@Database(
    entities = [User::class],
    version = 1
)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

Core Data — إطار iOS

Core Data هو إطار Apple لإدارة رسم الكائنات وحفظه على القرص. على عكس Room، يعمل Core Data ليس مع الجداول بل مع الكائنات المدارة (NSManagedObject) التي تشكل تسلسلًا هرميًا من العلاقات. يدعم Core Data التحميل الكسول، وتراجع التغييرات والاستعلامات المعقدة عبر NSFetchRequest.

كومة Core Data

يتكون جوهر Core Data من ثلاثة مكونات: سياق الكائنات المدارة (NSManagedObjectContext)، ومنسق التخزين الدائم (NSPersistentStoreCoordinator) ونموذج البيانات (NSManagedObjectModel). يوحد NSPersistentContainer جميع المكونات في نقطة دخول واحدة، مما يبسط الإعداد لتطبيقات Swift الحديثة.

swift
import CoreData

class PersistenceController {
    static let shared = PersistenceController()
    let container: NSPersistentContainer

    init() {
        container = NSPersistentContainer(name: "AppModel")
        container.loadPersistentStores { _, error in
            if let error = error {
                fatalError("Failed: \(error)")
            }
        }
    }

    func saveUser(name: String, email: String) {
        let context = container.viewContext
        let user = User(context: context)
        user.name = name
        user.email = email

        do {
            try context.save()
        } catch let error {
            print("Save error: \(error)")
        }
    }
}

يستخدم تخزين الملفات (File Storage) لحفظ الصور والفيديو والمستندات. يوفر Android تخزينًا داخليًا (context.filesDir) — خاص بالتطبيق، وتخزينًا خارجيًا (Environment.getExternalStorageDirectory) — متاح للتطبيقات الأخرى. في iOS، تحفظ الملفات في دليلي Documents و Library، حيث Library/Caches مخصص للذاكرة المؤقتة التي لا تنسخ احتياطيًا في iCloud. للعمل مع الملفات، توفر كلتا المنصتين File API وعمليات القراءة/الكتابة المتدفقة. تضيف المكتبات الحديثة مثل Coil و SDWebImage طبقة تخزين مؤقت، تجمع بين تخزين الملفات والذاكرة العشوائية لأداء أمثل.

في Android، بديل Core Data من حيث التعقيد والوظائف هو Realm، قاعدة بيانات كائنية تعمل مباشرة مع النماذج دون طبقة SQL. Realm أسرع من SQLite في عمليات القراءة وتدعم الكائنات الحية التي تحدث واجهة المستخدم تلقائيًا عند تغير البيانات.

الأسئلة الشائعة

ما هو Data Persistence في التطوير المحمول؟

Data Persistence هي آليات حفظ البيانات في الذاكرة غير المتطايرة للجهاز، مما يضمن توفرها بعد إعادة تشغيل التطبيق. تشمل قواعد البيانات، وتخزين الملفات وأنظمة الإعدادات.

ما الفرق بين Room واستخدام SQLite مباشرة؟

Room هي طبقة ORM فوق SQLite تلغي الكتابة اليدوية لاستعلامات SQL و ContentValues. Room تتحقق من استعلامات SQL أثناء البناء، وتدعم Kotlin Coroutines و Flow، وتولد تلقائيًا كود الوصول إلى البيانات.

متى يجب استخدام SharedPreferences؟

SharedPreferences مناسبة لتخزين كميات صغيرة من البيانات البسيطة: إعدادات التطبيق، والعلامات، والمعرفات وتفضيلات المستخدم. للبيانات المعقدة أو المنظمة، يفضل استخدام Room أو DataStore.

ما هو Core Data على iOS؟

Core Data هو إطار Apple لإدارة رسم الكائنات. يوفر الكائنات المدارة، وتتبع التغييرات، والتحميل الكسول والحفظ التلقائي في مخزن دائم (SQLite، XML أو تنسيق ثنائي).

ما طريقة التخزين التي يجب اختيارها لمشروع جديد؟

يعتمد الاختيار على تعقيد البيانات: للإعدادات — DataStore أو UserDefaults، للسجلات المنظمة — Room (Android) أو Core Data (iOS)، للملفات — File Storage. تشمل المعايير حجم البيانات، ومتطلبات الأداء والحاجة إلى التشفير. يعد الجمع بين عدة آليات في تطبيق واحد ممارسة قياسية، تسمح باستخدام نقاط القوة لكل نهج بأمثل صورة.

الملخص

  • Data Persistence — أساس أي تطبيق محمول، يضمن الحفاظ على بيانات المستخدم بين الجلسات
  • SharedPreferences و UserDefaults — أنظمة بسيطة لتخزين أزواج مفتاح-قيمة مع وصول متزامن
  • SQLite — قاعدة بيانات علاقاتية مضمنة متاحة على كلتا المنصتين دون تبعيات إضافية
  • Room — حل ORM من Google يوفر أمان الأنواع واستعلامات تفاعلية عبر Flow
  • Core Data — إطار Apple القوي لإدارة رسوم الكائنات المعقدة مع تتبع تلقائي للتغييرات
  • DataStore — بديل حديث لـ SharedPreferences مع API غير متزامن مبني على Coroutines و Flow

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا