Room Android Jetpack tarkibidagi ORM kutubxonasi bo'lib, Android-da lokal ma'lumotlar bazalari bilan ishlash uchun SQLite ustidan abstraksiya qatlamini ta'minlaydi. Rasmiy hujjatlarga ko'ra Android Developers, 2025, Room kompilatsiya vaqtida annotatsiyalar asosida DAO implementatsiyalarini avtomatik yaratadi va bu SQLiteOpenHelper-dan to'g'ridan-to'g'ri foydalanish bilan solishtirganda taxminan 70% shablon kodni yo'q qiladi. Kutubxona SQL so'rovlarini kompilatsiya bosqichida tekshiradi, bu esa dastur qurilmada ishga tushirilishidan oldin sintaktik xatolarni aniqlash imkonini beradi.
Asosiy ma'lumotlar
Room Android Jetpack tarkibidagi, Google tomonidan Android platformasida lokal SQLite ma'lumotlar bazalari bilan ishlashni soddalashtirish uchun yaratilgan ORM kutubxonasidir. U ma'lumot sxemasini tavsiflash uchun annotatsiyalarni ta'minlaydi va kompilatsiya bosqichida DAO interfeyslarining implementatsiyasini avtomatik yaratadi. SQLiteOpenHelper-dan to'g'ridan-to'g'ri foydalanishdan farqli o'laroq, Room dasturchini ma'lumotlar bazasi bilan bog'lanishni yaratish, ochish va boshqarish uchun katta hajmdagi shablon kodni yozishdan ozod qiladi.
Kutubxona Google I/O 2017-da Android arxitektura komponentlarining bir qismi sifatida taqdim etilgan. O'shandan beri Room lokal ma'lumotlarni saqlash uchun de-fakto standartga aylangan va Android uchun GreenDAO va Realm kabi yechimlarni mashhurlikda ortda qoldirgan. Google ma'lumotlariga ko'ra, kutubxona Google Play-da nashr etilgan, qurilmada lokal ma'lumotlar bilan ishlaydigan ilovalarning 60% dan ortig'ida qo'llaniladi.
Asosiy xususiyat — annotatsiya protsessori yordamida SQL so'rovlarini kompilatsiya bosqichida tekshirish. Agar dasturchi SQL buyrug'ida xato qilsa, masalan, mavjud bo'lmagan ustun nomini ko'rsatsa, dastur o'rnatilishidan oldin kompilatsiya xato bilan yakunlanadi. Bu SQLiteOpenHelper yondashuvidan tubdan farq qiladi, bunday xatolar faqat ishga tushirish vaqtida, ko'pincha ishlab chiqarishda aniqlanadi.
SQLite faqat beshta ma'lumot turini qo'llab-quvvatlaydi: TEXT, INTEGER, REAL, BLOB va NULL. Biroq Java va Kotlin-da murakkab turlar ishlatiladi: Date, List, Enum va maxsus ob'ektlar. Ularni saqlash uchun Room TypeConverters mexanizmini ta'minlaydi — murakkab turni SQLite uchun tushunarli bo'lgan ibtidoiy turga aylantiruvchi statik metodlar. Masalan, Date ob'ekti Long-ga (timestamp), List<String> esa Gson yoki Moshi orqali JSON qatoriga aylantiriladi.
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
val db = Room
.databaseBuilder(context, AppDatabase::class.java, "app-db")
.build()
Konvertorni e'lon qilish uchun statik metodga @TypeConverter annotatsiyasini qo'shish va ma'lumotlar bazasi darajasida @TypeConverters annotatsiyasida konvertor sinfini ko'rsatish kifoya. Room har bir SQL so'rovida tegishli turni o'qish va yozishda konvertorni avtomatik qo'llaydi, konvertatsiya metodlarini qo'lda chaqirish talab qilinmaydi.
Room uchta asosiy komponentdan iborat: Entity, DAO va Database. Har biri qat'iy belgilangan rolni bajaradi va tegishli annotatsiya bilan belgilanadi. Birgalikda ular ilovaning biznes mantig'ini SQLite implementatsiya detallaridan izolyatsiya qiluvchi to'liq ma'lumotga kirish qatlamini tashkil qiladi.
Entity bazada bitta jadvalning strukturasini tavsiflovchi ma'lumot sinfidir. Sinfning har bir maydoni jadval ustuniga, bazadagi har bir qator esa sinfning bir nusxasiga mos keladi. @Entity annotatsiyasi Room-ga sinfning jadval ekanligini bildiradi. @PrimaryKey annotatsiyasi bo'lgan maydon avtomatik ortib boruvchi yoki murakkab bo'lishi mumkin bo'lgan asosiy kalitni belgilaydi. Jadvalar orasidagi bog'lanish uchun @ForeignKey ishlatiladi, ma'lumotlar bazasi darajasida ma'lumotlar yaxlitligini ta'minlaydi.
@Entity(tableName = "users")
data class User(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
@ColumnInfo(name = "full_name")
val name: String,
val age: Int,
val email: String
)
DAO (Data Access Object) ma'lumotlar bilan ishlash uchun operatsiyalarni e'lon qiluvchi interfeys yoki abstrakt sinfdir: kiritish, o'qish, yangilash va o'chirish. Har bir operatsiya @Insert, @Query, @Update yoki @Delete bilan annotatsiya qilinadi. Room bu interfeysning implementatsiyasini kompilatsiya bosqichida avtomatik yaratadi. Alohida qiymat @Query annotatsiyasiga ega — u SQL so'rovini qator sifatida qabul qiladi va uni qurish bosqichida to'g'riligini tekshiradi.
@Dao
interface UserDao {
@Insert
suspend fun insert(user: User): Long
@Query("SELECT * FROM users WHERE id = :userId")
suspend fun getUserById(userId: Int): User?
@Query("SELECT * FROM users")
fun getAllUsers(): Flow<List<User>>
@Delete
suspend fun delete(user: User)
}
Database RoomDatabase-dan meros oladigan, ma'lumotlar bazasiga kirish nuqtasi bo'lib xizmat qiluvchi abstrakt sinfdir. U barcha Entity-lar ro'yxatini o'z ichiga oladi va DAO olish uchun abstrakt metodlarni taqdim etadi. Sinf @Database bilan annotatsiya qilinadi, unda sxema versiyasi va mavjudotlar ro'yxati ko'rsatiladi. Baza nusxasini yaratish Room.databaseBuilder orqali ilova konteksti, fayl nomi va Database sinfi ko'rsatilgan holda amalga oshiriladi.
Room SQLite-ni almashtirmaydi, balki uning ustida abstraksiya qatlami sifatida ishlaydi. Ichki arxitektura annotatsiya protsessori, kod generatori va ulanishlar hovuzini o'z ichiga oladi. Kompilatsiya bosqichida annotatsiya protsessori Entity, DAO va Database sinflarini tahlil qiladi, so'ngra _Impl qo'shimchasi bilan implementatsiya sinflarini yaratadi. Barcha yaratilgan sinflar qurish paketiga joylashtiriladi va dasturchiga to'g'ridan-to'g'ri ko'rinmaydi.
Kompilatsiya bosqichida kod yaratish — Room-ning markaziy mexanizmi. Har bir DAO interfeysi uchun barcha annotatsiya qilingan metodlarning to'liq implementatsiyasi bilan sinf yaratiladi. @Query annotatsiyasidan SQL so'rovlari to'g'rilik uchun tekshiriladi: protsessor ustun nomlarini Entity maydonlari bilan moslashtiradi va SQL sintaksisini tekshiradi. Xato aniqlanganda, kompilatsiya tushunarli xabar bilan to'xtatiladi. Bu xom SQLiteOpenHelper ishlatish bilan mumkin emas, unda xatolar faqat ishga tushirish vaqtida paydo bo'ladi.
Yaratish jarayoni uch bosqichdan iborat. Birinchi — sxemani tekshirish: protsessor @Database-da sanab o'tilgan barcha sinflarning to'g'ri Entity ekanligini tekshiradi. Ikkinchi — DAO tanasini yaratish: har bir metod uchun tayyorlangan so'rovlarni bajaruvchi ichki RoomSQLiteQuery ob'ektidan foydalanib implementatsiya yaratiladi. Uchinchi — Database_Impl sinfini yaratish, bazani yaratish va ochishni, shuningdek barcha DAO ob'ektlarini ishga tushirishni amalga oshiradi.
class UserDao_Impl(private val __db: RoomDatabase) : UserDao {
private val __insertionAdapter = __db
.createInsertionAdapter(User::class, 0)
override suspend fun insert(user: User): Long {
__db.assertNotSuspendingTransaction()
return __db.runInTransaction {
__insertionAdapter.insertAndReturnId(user)
}
}
}
Room baza operatsiyalari uchun alohida oqimlar hovuzini yaratmaydi. Odatiy bo'lib, so'rovlar chaqiruvchi oqimda bitta cheklov bilan bajariladi: o'qish va yozish oqimni bloklaydi. Asinxron ish uchun Room Kotlin korutinlari bilan suspend-funksiyalar orqali, LiveData bilan qaytariladigan qiymatlar orqali va Flow bilan reaktiv o'rashlar orqali integratsiyalanadi. Bu dasturchiga aniq vazifa uchun arxitektura yechimini tanlashda moslashuvchanlik beradi.
Room yordamida eslatmalarni saqlash uchun ilova yaratishning amaliy misolini ko'rib chiqaylik. Ilova id, title, content va timestamp maydonlari bilan bitta Note jadvalini o'z ichiga oladi. Foydalanuvchi eslatmalarni qo'shishi, ko'rishi va o'chirishi mumkin bo'ladi. Namoyish uchun asinxron operatsiyalar uchun korutinlar qo'llaniladi.
Room-ni Android loyihasiga ulash uchun ilova modulining build.gradle fayliga bog'liqliklarni qo'shish kerak. Room uchta komponentni talab qiladi: runtime kutubxonasi, kapt annotatsiya protsessori va korutinlar uchun ixtiyoriy qo'llab-quvvatlash. Kutubxona versiyasi yangilash qulayligi uchun room_version o'zgaruvchisida ko'rsatiladi. Room 2.4.0 dan boshlab, yuqori qurish tezligi bilan kapt-ga muqobil sifatida KSP qo'llab-quvvatlanadi.
dependencies {
def room_version = "2.6.1"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-ktx:$room_version"
// Ixtiyoriy: test qilish
testImplementation "androidx.room:room-testing:$room_version"
}
Bog'liqliklar sozlangandan so'ng, uchta fayl yaratiladi: Note Entity, NoteDao interfeysi va AppDatabase sinfi. Note Entity-si @PrimaryKey va @ColumnInfo annotatsiyalari bo'lgan maydonlarni o'z ichiga oladi. DAO kiritish, ro'yxatni olish va o'chirish uchun metodlarni taqdim etadi. Database @Database annotatsiyasi orqali Entity va DAO-ni bog'laydi.
@Entity(tableName = "notes")
data class Note(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
val title: String,
val content: String,
@ColumnInfo(name = "created_at")
val timestamp: Long = System.currentTimeMillis()
)
@Dao
interface NoteDao {
@Insert
suspend fun insert(note: Note)
@Query("SELECT * FROM notes ORDER BY created_at DESC")
fun getAllNotes(): Flow<List<Note>>
@Delete
suspend fun delete(note: Note)
}
AppDatabase fayli RoomDatabase-dan meros oladigan abstrakt sinf sifatida e'lon qilinadi. @Database annotatsiyasida joriy versiyaning barcha Entity-lari va sxema versiya raqami ko'rsatiladi. Nusxani olish uchun ilova konteksti bilan Room.databaseBuilder build metodi orqali singleton naqshidan foydalaniladi. Baza nusxasini keshlash xotira oqishiga olib kelishi mumkin bo'lgan ko'p martalik yaratishlarning oldini oladi.
Migratsiyalar Room-da mavjud ma'lumotlarni yo'qotmasdan ilova yangilanishi vaqtida ma'lumotlar bazasi sxemasini o'zgartirish mexanizmidir. Foydalanuvchi o'zgartirilgan Entity-lar bilan yangi versiyani o'rnatganda, Room versiyalarning nomuvofiqligini aniqlaydi va ko'rsatilgan migratsiya qadamlarini bajaradi. Migratsiyasiz ma'lumotlar bazasi o'chiriladi va qayta yaratiladi, bu esa barcha saqlangan foydalanuvchi ma'lumotlarining yo'qolishiga olib keladi.
Migratsiya bazaning boshlang'ich va yakuniy versiyasini qabul qiluvchi Migration sinfi bilan tavsiflanadi. migrate metodi ichida sxemani o'zgartirish uchun ALTER TABLE yoki CREATE TABLE SQL so'rovi bajariladi. Room sxema o'zgarishlarini avtomatik aniqlay olmaydi — dasturchi Entity-dagi har bir o'zgarish uchun qo'lda migratsiya yozishi kerak. Room 2.4.0 versiyasidan boshlab, migratsiyalarni avtomatik yaratish uchun eksperimental autoMigrations funksiyasi mavjud.
autoMigrations funksiyasi Room-ga Entity versiyalari orasidagi farqlar asosida migratsiyalarni avtomatik yaratish imkonini beradi. Uni ishlatish uchun @Database-ga @AutoMigration annotatsiyasini qo'shish va sxemani JSON-ga eksport qilishni ko'rsatish kifoya. Room qo'shni versiyalarning sxemalarini taqqoslaydi va kerakli ALTER so'rovlarini yaratadi. Biroq autoMigrations faqat orqaga mos o'zgarishlarni qo'llab-quvvatlaydi: ustunlar qo'shish, indekslar yaratish va mos konvertatsiyalar bilan turlarni o'zgartirish.
val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL(
"ALTER TABLE users ADD COLUMN phone TEXT"
)
}
}
val db = Room
.databaseBuilder(context, AppDatabase::class.java, "app-db")
.addMigrations(MIGRATION_1_2)
.build()
Ustunlarni qayta nomlash yoki jadvallarni birlashtirish kabi murakkab o'zgarishlar qo'shilganda, oraliq jadvallardan foydalanib qo'lda migratsiya talab qilinadi. Odatiy stsenariy: eski sxema bilan vaqtinchalik jadval yaratish, eski jadvaldan ma'lumotlarni konvertatsiyalar bilan yangi jadvalga nusxalash, eski jadvalni o'chirish va vaqtinchalik jadvalni qayta nomlash. Room barcha migratsiyalarning bitta tranzaksiyada bajarilishini va xato yuz berganda o'zgarishlarning to'liq bekor qilinishini kafolatlaydi.
Tez-tez so'raladigan savollar
Room annotatsiyalar va kompilatsiya bosqichida SQL tekshiruvi bilan ORM abstraksiyasini ta'minlaydi, SQLiteOpenHelper esa barcha so'rovlarni qo'lda yozish va ulanishni boshqarishni talab qiladi. Room CRUD operatsiyalari uchun kodni avtomatik yaratadi va LiveData va Flow ni o'z ichiga olgan Android arxitektura komponentlari bilan integratsiyalanadi.
Room barcha Java ibtidoiy turlarini qo'llab-quvvatlaydi: Int, Long, Boolean, Float, Double, shuningdek String, ByteArray va Date. List yoki Enum kabi murakkab turlar uchun TypeConverters ishlatiladi — nostandart turlarni SQLite tomonidan qo'llab-quvvatlanadigan formatlarga aylantiruvchi statik konvertatsiya metodlari.
Ha, Room korutinsiz sinxron chaqiruvlarni qo'llab-quvvatlaydi, lekin ular bajariladigan oqimni bloklaydi. Asinxron ish uchun korutinlar o'rniga LiveData yoki RxJava ishlatilishi mumkin. Google yangi loyihalarda ma'lumotlarga asinxron kirishning asosiy usuli sifatida korutinlardan foydalanishni tavsiya qiladi.
Agar Room ma'lumotlar bazasi versiyasining nomuvofiqligini aniqlasa va mos migratsiyani topmasa, odatiy bo'lib xato tavsifi bilan IllegalStateException yuzaga keladi. Dasturchi bu xatti-harakatni fallbackToDestructiveMigration metodi bilan bekor qilishi mumkin, bu mavjud bazani o'chiradi va barcha ma'lumotlarni yo'qotish bilan yangisini yaratadi.
Room @Embedded annotatsiyasi bilan ichki joylashtirilgan ob'ektlar va @Relation annotatsiyasi bilan munosabat sinflari orqali munosabatlarni qo'llab-quvvatlaydi. Jadvallarni birlashtirish bilan murakkab so'rovlar uchun maydonlari SQL-da JOIN operatori bilan @Query natijalaridan to'ldiriladigan maxsus POJO sinflari ishlatiladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.