ما هو Room ولماذا هو مطلوب؟
\n\nRoom هي مكتبة للعمل مع قواعد البيانات في تطبيقات Android المكتوبة بلغة Kotlin أو Java. توفر طبقة تجريد فوق SQLite، مما يسمح بالعمل مع قاعدة البيانات من خلال نهج كائني التوجه بدلاً من استعلامات SQL الخام.
\n\nالمزايا الرئيسية لـ Room:
\n- \n
- تقليل الكود النمطي — يقوم Room تلقائيًا بتوليد الكود للعمل مع SQLite بناءً على التعليقات التوضيحية (annotations). \n
- التحقق من استعلامات SQL في مرحلة التجميع — يتم اكتشاف الأخطاء في الاستعلامات قبل تشغيل التطبيق. \n
- التكامل مع Coroutines و Flow — دعم البرمجة التفاعلية والعمليات غير المتزامنة. \n
- ترحيل قاعدة البيانات — آليات مدمجة لتحديث المخطط دون فقدان البيانات. \n
- TypeConverters — إمكانية تخزين أنواع البيانات المعقدة (مثل Date، List) في قاعدة البيانات. \n
Room مثالي للتطبيقات التي تحتاج إلى تخزين محلي للبيانات المنظمة: الملاحظات، التخزين المؤقت، إعدادات المستخدم، وضع عدم الاتصال، إلخ.
\n\nتثبيت Room
\n\nلا يتم تثبيت Room عبر pip أو npm، لأنه مكتبة خاصة بـ Android. تتم الإضافة إلى المشروع من خلال ملف build.gradle (على مستوى الوحدة).
الخطوة 1: أضف إضافة KSP (Kotlin Symbol Processing)
\nفي ملف build.gradle الجذر، أضف إضافة KSP:
plugins {\n id 'com.google.devtools.ksp' version '1.9.0-1.0.13' apply false\n}\n\nالخطوة 2: قم بتوصيل Room في وحدة التطبيق
\nفي ملف build.gradle للوحدة app، أضف:
plugins {\n id 'com.android.application'\n id 'org.jetbrains.kotlin.android'\n id 'com.google.devtools.ksp'\n}\n\nandroid {\n // ... إعداداتك\n}\n\ndependencies {\n def room_version = "2.6.1"\n\n implementation "androidx.room:room-runtime:$room_version"\n ksp "androidx.room:room-compiler:$room_version"\n implementation "androidx.room:room-ktx:$room_version" // لـ Coroutines\n}\n\nبعد مزامنة Gradle، تصبح المكتبة جاهزة للاستخدام.
\n\nبداية سريعة مع مثال كود
\n\nلنقم بإنشاء تطبيق بسيط لتخزين قائمة المهام (Todo).
\n\nالخطوة 1: تعريف الكيان (Entity)
\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\n\n@Entity(tableName = "tasks")\ndata class Task(\n @PrimaryKey(autoGenerate = true)\n val id: Int = 0,\n val title: String,\n val description: String,\n val isCompleted: Boolean = false\n)\n\nالخطوة 2: إنشاء DAO (Data Access Object)
\nimport androidx.room.*\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface TaskDao {\n @Query("SELECT * FROM tasks ORDER BY id DESC")\n fun getAllTasks(): Flow<List<Task>>\n\n @Insert\n suspend fun insertTask(task: Task)\n\n @Update\n suspend fun updateTask(task: Task)\n\n @Delete\n suspend fun deleteTask(task: Task)\n}\n\nالخطوة 3: إنشاء قاعدة البيانات
\nimport android.content.Context\nimport androidx.room.Database\nimport androidx.room.Room\nimport androidx.room.RoomDatabase\n\n@Database(entities = [Task::class], version = 1)\nabstract class AppDatabase : RoomDatabase() {\n abstract fun taskDao(): TaskDao\n\n companion object {\n @Volatile\n private var INSTANCE: AppDatabase? = null\n\n fun getDatabase(context: Context): AppDatabase {\n return INSTANCE ?: synchronized(this) {\n val instance = Room.databaseBuilder(\n context.applicationContext,\n AppDatabase::class.java,\n "app_database"\n ).build()\n INSTANCE = instance\n instance\n }\n }\n }\n}\n\n