قاعدة بيانات Room
احفظوا البيانات المنظّمة محليًا باستخدام Room. عرّفوا Entities وDAOs وفئة Database. نفّذوا الاستعلامات باستخدام SQL، وراقبوا النتائج باستخدام LiveData أو Flow.
قاعدة بيانات Room درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 2 من أصل 6. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 6 دروس في المجموع.
ما هو Room؟
Room هي مكتبة Google الموصى بها لحفظ البيانات في Android. وهي غلاف حول SQLite يوفّر لك ما يلي:
- استعلامات SQL آمنة النوع، يتم التحقق منها أثناء الترجمة
- دعم Kotlin coroutines
- تكامل LiveData وFlow
- دعم الترحيل عند تغيير المخطط
المكوّنات الثلاثة لـ Room
تتكوّن Room من ثلاث annotations:
@Entity— data class تُطابق جدولًا في قاعدة البيانات@Dao(كائن الوصول إلى البيانات) — واجهة تحتوي على استعلامات SQL@Database— فئة قاعدة البيانات الرئيسية التي تربط كل شيء معًا
إضافة تبعيات Room
أضف Room إلى app/build.gradle:
// app/build.gradle
plugins {
id 'kotlin-kapt' // needed for Room annotation processor
}
dependencies {
val roomVersion = "2.6.1"
implementation "androidx.room:room-runtime:$roomVersion"
kapt "androidx.room:room-compiler:$roomVersion"
implementation "androidx.room:room-ktx:$roomVersion" // coroutine support
}تعريف Entity
أضف annotation @Entity إلى data class لإنشاء جدول في قاعدة البيانات:
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "notes")
data class Note(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
val title: String,
val body: String,
val createdAt: Long = System.currentTimeMillis()
)
// Each field = one column in the database table
// @PrimaryKey autoGenerate = Room assigns the id automaticallyإنشاء DAO
عرّف الاستعلامات في واجهة DAO. تنشئ Room التنفيذ نيابةً عنك:
import androidx.room.*
import kotlinx.coroutines.flow.Flow
@Dao
interface NoteDao {
@Query("SELECT * FROM notes ORDER BY createdAt DESC")
fun getAllNotes(): Flow<List<Note>> // emits new list whenever data changes
@Query("SELECT * FROM notes WHERE id = :noteId")
suspend fun getNoteById(noteId: Int): Note?
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(note: Note)
@Update
suspend fun update(note: Note)
@Delete
suspend fun delete(note: Note)
}إنشاء قاعدة البيانات
تُعد فئة @Database نقطة الدخول إلى Room. أنشئها مرة واحدة واحتفظ بها كمفردة:
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import android.content.Context
@Database(entities = [Note::class], version = 1, exportSchema = false)
abstract class NoteDatabase : RoomDatabase() {
abstract fun noteDao(): NoteDao
companion object {
@Volatile private var INSTANCE: NoteDatabase? = null
fun getInstance(context: Context): NoteDatabase {
return INSTANCE ?: synchronized(this) {
Room.databaseBuilder(
context.applicationContext,
NoteDatabase::class.java,
"note_database"
).build().also { INSTANCE = it }
}
}
}
}استخدام Room في ViewModel
اربط DAO في ViewModel باستخدام coroutines:
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
class NoteViewModel(private val dao: NoteDao) : ViewModel() {
val notes = dao.getAllNotes() // Flow — auto-updates when DB changes
fun addNote(title: String, body: String) {
viewModelScope.launch {
dao.insert(Note(title = title, body = body))
}
}
fun deleteNote(note: Note) {
viewModelScope.launch {
dao.delete(note)
}
}
}مراقبة بيانات Room في واجهة المستخدم
اجمع Flow من Room في Activity أو Fragment:
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
class NoteActivity : AppCompatActivity() {
private val viewModel: NoteViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ...
lifecycleScope.launch {
viewModel.notes.collect { notes ->
adapter.submitList(notes) // update RecyclerView
}
}
}
}ترحيل قاعدة البيانات
عند تغيير Entity، مثل إضافة عمود أو إعادة تسمية جدول، يجب توفير ترحيل حتى لا تُفقد بيانات المستخدمين الحالية.
زِد رقم الإصدار في @Database(version = 2) وعرّف كائن Migration يحتوي على SQL لتحويل المخطط القديم إلى الجديد.
تحقق سريع
أي annotation في Room تحدد أن إحدى طرق الواجهة هي استعلام SQL من نوع SELECT؟
مراجعة: قاعدة بيانات Room
أصبحت الآن قادرًا على إنشاء تطبيقات تحفظ البيانات محليًا:
@Entity— data class ← جدول في قاعدة البيانات@Dao— واجهة تحتوي على@Queryو@Insertو@Delete@Database— نقطة دخول مفردة- أعد
Flow<List>من DAO للحصول على تحديثات مباشرة - استدعِ DAO من ViewModel باستخدام
viewModelScope.launch
التالي: كتابة شيفرة غير متزامنة من دون callbacks باستخدام Coroutines.
الأسئلة الشائعة
هل درس «قاعدة بيانات Room» مجاني؟
نعم — نص درس «قاعدة بيانات Room» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 6 دروس في المجموع.
ماذا ستتعلم في «قاعدة بيانات Room»؟
احفظوا البيانات المنظّمة محليًا باستخدام Room. عرّفوا Entities وDAOs وفئة Database. نفّذوا الاستعلامات باستخدام SQL، وراقبوا النتائج باستخدام LiveData أو Flow. تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟
لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 6.
كم من الوقت يستغرق درس «قاعدة بيانات Room»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟
نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ViewModel وLiveData
- قاعدة بيانات Room
- Coroutines والدوال المعلّقة
- نمط Repository
- مكوّن Navigation
- حقن التبعيات باستخدام Hilt