Room: asosiy tushunchalar, Entity, DAO va ma'lumotlar bazasi bilan ishlash

Muallif: IT Sectr Nashr etilgan: 2026-05-04 O'qish vaqti: 8 daq

Room — bu Jetpack tarkibiga kiruvchi, Androidda SQLite bilan ishlash uchun kutubxona. U xom SQLite ustidan abstraktsiya qatlamini taqdim etadi, jadvallar yaratish, so'rovlarni bajarish va ma'lumotlarni Kotlin va Java ob'ektlariga konvertatsiya qilishni avtomatlashtiradi. Android Developers ma'lumotiga ko'ra, Room SQL so'rovlarini qurish bosqichida kompilyatsiya qiladi, sintaksisning to'g'riligini va Entity bilan jadvallar o'rtasidagi bog'lanishlarni tekshiradi.

Asosiy fikrlar

  • Room — Android ilovalarida SQLite bilan ishlash uchun Jetpack ORM kutubxonasi.
  • Entity — @Entity bilan annotatsiya qilingan sinf, har bir namunasi jadvaldagi qatorga mos keladi.
  • DAO — SQL so'rovlari uchun annotatsiya qilingan metodlarga ega Data Access Object.
  • Database — RoomDatabase-dan meros oladigan, Entity va DAO-ni bog'lovchi abstrakt sinf.
  • Migratsiya — foydalanuvchi ma'lumotlarini yo'qotmasdan ma'lumotlar bazasi sxemasini xavfsiz o'zgartirish mexanizmi.

Room nima va nima uchun kerak

Room — Android Jetpack tarkibiga kiruvchi, SQLite uchun ob'ekt-relatsion xaritalashni ta'minlovchi saqlash kutubxonasidir. Room xom SQLite-ning uchta asosiy muammosini hal qiladi: jadvallar yaratish uchun ko'p miqdorda boilerplate kod yozish, SQL so'rovlarini kompilyatsiya bosqichida tekshirmaslik va Cursor-ni qo'lda ob'ektlarga konvertatsiya qilish.

Kutubxona annotatsiya kompilyatoridan (kapt yoki KSP) foydalanadi, u qurish bosqichida RoomDatabase va DAO abstrakt sinflarining implementatsiyasini yaratadi. Bu SQLdagi sintaksis xatolari va tip nomuvofiqligi ilova ishga tushirilishidan oldin — Google Playda nashr etilgandan keyin runtime-da emas — aniqlanishini kafolatlaydi.

Google I/O 2023 ma'lumotiga ko'ra, Room mahalliy ma'lumotlar bilan ishlaydigan Android ilovalarining 68 foizida qo'llaniladi. Bu Google tomonidan barcha yangi loyihalar uchun tavsiya etilgan qurilmada ma'lumot saqlash standartidir — eskirgan SQLiteOpenHelper va ContentProvider o'rniga.

Room-ni serverdan ma'lumotlarni mahalliy keshlash, oflayn rejim yoki murakkab SQL so'rovlari imkoniyati bilan tuzilgan foydalanuvchi ma'lumotlarini saqlash talab qilinadigan loyihalarda qo'llang.

Room Android Jetpack-ning bir qismidir va Google tomonidan mahalliy ma'lumotlar bilan ishlaydigan barcha yangi loyihalar uchun rasman tavsiya etiladi. Realm yoki ObjectBox-dan farqli o'laroq, Room mahalliy SQLite-dan foydalanadi, bu DB Browser-dan DataGrip-gacha bo'lgan har qanday uchinchi tomon vositalari bilan moslikni kafolatlaydi. Dasturchi ilovaning .db faylini ochib, to'g'ridan-to'g'ri SQL so'rovlarini bajarishi mumkin, bu esa ishlab chiqish jarayonida ma'lumotlarni disk raskadrovka qilish va tahlil qilishni osonlashtiradi.

Entity va Roomda annotatsiyalar

Entity — @Entity bilan annotatsiya qilingan ma'lumot sinfi bo'lib, Room uni ma'lumotlar bazasi jadvaliga aylantiradi. Sinfning har bir maydoni jadval ustuniga, har bir namunasi esa qatorga aylanadi. Room maydonlarga kirish uchun refeksiyadan foydalanadi, shuning uchun majburiy identifikator uchun @PrimaryKey annotatsiyasi talab qilinadi.

Asosiy annotatsiyalar

@Entity annotatsiyasi Room-ga sinf jadval ekanligini bildiradi. tableName parametri jadval nomini belgilaydi, agar u sinf nomidan farq qilsa. @PrimaryKey autoGenerate = true orqali avto-generatsiya imkoniyati bilan asosiy kalitni aniqlaydi.

kotlin
@Entity(tableName = "users")
data class User(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,
    @ColumnInfo(name = "full_name")
    val name: String,
    @Ignore
    val tempData: String?
)

@ColumnInfo jadvaldagi ustun nomini belgilaydi, agar u Kotlin maydoni nomidan farq qilsa. @Ignore maydonni jadvaldan chiqarib tashlaydi — u ma'lumotlar bazasiga saqlanmaydi. @ForeignKey o'chirish yoki yangilashda kaskad operatsiyalari bilan jadvallar o'rtasidagi tashqi kalitlarni tavsiflaydi.

Room @Embedded annotatsiyasi orqali ichki joylashgan ob'ektlarni qo'llab-quvvatlaydi. Ichki sinfning maydonlari nom konfliktidan qochish uchun prefiks bilan ota-ona jadvalining ustunlariga ochiladi. Masalan, city va street maydonlariga ega Address sinfi User-ga joylashtirilganda, users jadvalida address_city va address_street ustunlarini yaratadi va oddiy qiymat ob'ektlari uchun alohida jadvallar yaratish zaruratini bartaraf qiladi.

Konvertatsiya turlari

Room faqat primitiv turlarni va ularning o'ramlarini qo'llab-quvvatlaydi. Ro'yxatlar, Date yoki maxsus turlarni saqlash uchun @TypeConverter ishlatiladi — maxsus tur bilan SQLite primitivi o'rtasidagi statik konvertatsiya metodlari, masalan, List va JSON qatori o'rtasida.

DAO va SQL so'rovlari

DAO (Data Access Object) — @Dao bilan annotatsiya qilingan, ma'lumotlarga kirish metodlarini o'z ichiga olgan interfeys yoki abstrakt sinf. Har bir metod SQL operatsiyasi bilan annotatsiya qilinadi: @Insert, @Update, @Delete yoki aniq SQL so'rovi bilan @Query.

Kompilyatsiya bosqichida tekshirish bilan @Query

@Query annotatsiyasi Room tomonidan kompilyatsiya bosqichida sintaksisning to'g'riligi va ustun nomlarining Entity maydonlariga mosligi tekshiriladigan SQL qatorini qabul qiladi. Room :paramName sintaksisi orqali parametrlangan so'rovlarni qo'llab-quvvatlaydi.

kotlin
@Dao
interface UserDao {
    @Query("SELECT * FROM users WHERE id = :userId")
    suspend fun getUserById(userId: Int): User?

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertUser(user: User)

    @Query("SELECT * FROM users ORDER BY name ASC")
    fun getAllUsers(): Flow<List<User>>
}

@Insert takrorlanuvchi yozuvlarni kiritishda konfliktlarni boshqarish uchun OnConflictStrategy strategiyalarini qo'llab-quvvatlaydi. Qaytariladigan tur sifatida Flow jadvaldagi har bir ma'lumot o'zgarishida UI-ning reaktiv yangilanishini ta'minlaydi — obuna har bir INSERT, UPDATE yoki DELETE da avtomatik ravishda qayta ishga tushiriladi.

Murakkab operatsiyalar uchun @Transaction

@Transaction annotatsiyasi bitta tranzaksiya blokida bir nechta operatsiyalarning atomik bajarilishini kafolatlaydi. Room bajarish vaqtida ma'lumotlar bazasini bloklaydi, bir nechta oqimlardan parallel kirishda poyga holatining oldini oladi.

Database va sxema migratsiyalari

RoomDatabase — Entity va DAO-ni ma'lumotlar bazasiga yagona kirish nuqtasida birlashtiruvchi abstrakt sinf. U Room.databaseBuilder orqali sxema versiyasi va Entity sinflari ro'yxati ko'rsatilgan holda yaratiladi. Ma'lumotlar bazasi namunasini bir nechta ulanishlarning oldini olish uchun lazy-delegat orqali singleton sifatida yaratish tavsiya etiladi.

Migratsiyalar

Migratsiya Roomda — eski sxema versiyasidan yangisiga o'tish uchun SQL skriptini tavsiflovchi Migration sinfidir. Sxema o'zgarishi vaqtida migratsiya taqdim etilmasa, Room IllegalStateException chiqaradi. Bu ilova yangilanishi paytida foydalanuvchi ma'lumotlarining tasodifiy yo'qolishidan himoya qiladi.

kotlin
val migration_1_2 = object : Migration(1, 2) {
    override fun migrate(db: SupportSQLiteDatabase) {
        db.execSQL("ALTER TABLE users ADD COLUMN age INTEGER NOT NULL DEFAULT 0")
    }
}

val db = Room.databaseBuilder(
    getApplication(),
    AppDatabase::class.java,
    "app_database"
).addMigrations(migration_1_2)
 .build()

Ishlab chiqish uchun fallbackToDestructiveMigration dan foydalanish mumkin, u versiyalar mos kelmaganda eski bazani o'chirib, yangisini yaratadi. Bu rejim faqat disk raskadrovka uchun mo'ljallangan — ishlab chiqarish relizlarida majburiy ravishda migratsiyalar yoziladi.

Ma'lumotlar bazasini test qilish uchun Room maxsus Room.inMemoryTestBuilder sinfini taqdim etadi, u diskka saqlamasdan operativ xotirada ma'lumotlar bazasini yaratadi. Har bir test tugagandan so'ng, baza avtomatik ravishda yo'q qilinadi, bu test stsenariylarining to'liq izolyatsiyasini kafolatlaydi. android-arch-core-testing kutubxonasi bilan birgalikda dasturchi ma'lumotlar bazasining hayot aylanishini boshqarishi va holatni qo'lda tozalashga hojat qolmasdan migratsiyalarning to'g'riligini tekshirishi mumkin.

Room-ning ishlash unumdorligi to'g'ridan-to'g'ri so'rovlar va indekslarning tuzilishiga bog'liq. Sekin so'rovlarni tahlil qilish uchun Room enableQueryCallback bayrog'ini taqdim etadi, u barcha SQL so'rovlarini bajarilish vaqti bilan qayd qiladi. Dasturchi ushbu jurnalni 100 millisekunddan uzoq davom etadigan so'rovlarni topish va ularni @Entity-dagi @Index annotatsiyasi orqali murakkab indekslar qo'shish yoki @Relation yordamida pastki so'rovlarni to'g'ridan-to'g'ri JOIN bog'lanishlariga qayta yozish orqali optimallashtirishi mumkin.

Room shuningdek, SQLCipher orqali ma'lumotlar bazasini shifrlashni qo'llab-quvvatlaydi. net.zetetic:android-database-sqlcipher kutubxonasini ulash va standart o'rniga SupportFactory dan foydalanish DAO so'rovlari va Entity tuzilishini o'zgartirmasdan diskdagi barcha ma'lumotlarning shaffof shifrlanishini ta'minlaydi. Bu foydalanuvchilarning shaxsiy ma'lumotlari bilan ishlaydigan ilovalar uchun zarur va GDPR hamda Rossiyaning shaxsiy ma'lumotlarni himoya qilish to'g'risidagi 152-FZ qonuni talablariga javob beradi. Shifrlash paroli root qilingan qurilmalarda vositalar orqali chiqarib olishdan himoya qilish uchun Android Keystore-da saqlanishi mumkin.

Room Kotlin Coroutines va Flow bilan

Room 2.1 versiyasidan boshlab Kotlin Coroutines-ni mahalliy qo'llab-quvvatlaydi. DAO metodlari asosiy oqimni bloklamasdan fonda so'rovlarni bajaruvchi suspend funksiyalari bo'lishi mumkin. Room o'qish va yozish so'rovlari uchun Dispatchers.IO dan foydalanib, dispetcherlarni avtomatik boshqaradi.

Reaktiv so'rovlar uchun Room Flow qaytaradi — ta'sirlangan jadvaldagi har bir o'zgarishda yangi qiymat chiqaradigan sovuq ma'lumot oqimi. ViewModel stateIn yoki collect orqali Flow-ga obuna bo'ladi, adapterni qo'lda xabardor qilmasdan UI-ning avtomatik yangilanishini ta'minlaydi.

Room shuningdek Paging 3-ni SQLite-dan sahifama-sahifa ma'lumot yuklovchi maxsus PagingSource implementatsiyasi orqali qo'llab-quvvatlaydi. Bu minglab yozuvlarga ega katta ro'yxatlar uchun samarali: Paging 3 faqat ekranda ko'rinadigan qatorlarni yuklaydi va ma'lumotlar bazasidagi o'zgarishlarda ularni avtomatik yangilaydi.

Paging 3-ni Room bilan yangiliklar lentasi, operatsiyalar jurnali yoki oflayn kirish va cheksiz aylantirish imkoniyati bilan mahsulot ro'yxatini ko'rsatishda foydalaning.

Tez-tez beriladigan savollar

Room SQLiteOpenHelper-dan qanday farq qiladi?

Room jadvallar yaratish, Cursor-ni ob'ektlarga konvertatsiya qilish va SQL-ni kompilyatsiya bosqichida tekshirishni avtomatlashtiradi. SQLiteOpenHelper sxemani qo'lda yozishni, Cursor-ni qayta ishlashni talab qiladi va ilova ishga tushirilishidan oldin so'rovlarni tekshirmaydi, bu xatolar xavfini oshiradi.

Har bir sxema o'zgarishi uchun migratsiya yozish kerakmi?

Ha, Entity o'zgarishida (maydon qo'shish/o'chirish, turni o'zgartirish) migratsiya talab qilinadi. U bo'lmasa Room ishga tushirilganda IllegalStateException chiqaradi. Ishlab chiqish uchun fallbackToDestructiveMigration yoqilishi mumkin, ammo relizda to'g'ri migratsiya skriptlari majburiydir.

Room jadvallar o'rtasidagi munosabatlarni qo'llab-quvvatlaydimi?

Room kaskad operatsiyalari uchun @ForeignKey va ichki joylashgan ob'ektlar uchun @Relation-ni qo'llab-quvvatlaydi. Murakkab JOIN so'rovlari uchun @Transaction annotatsiyasi @Embedded va @Relation orqali ichki ob'ektlar bilan POJO qaytaruvchi @Query bilan ishlatiladi.

Room-dan Kotlinsiz Java bilan foydalanish mumkinmi?

Ha, Room Java bilan to'liq mos keladi. Suspend funksiyalari o'rniga LiveData yoki RxJava Observable, Flow o'rniga LiveData ishlatiladi. Room Java bilan bir xil annotatsiyalarning barchasini qo'llab-quvvatlaydi, ammo asinxron operatsiyalar uchun ko'proq boilerplate kod talab qiladi.

Room ma'lumotlar bazasini shifrlash qanday ishlaydi?

Room Zetetic-dan SQLCipher orqali shifrlashni qo'llab-quvvatlaydi. Room.databaseBuilder o'rniga net.zetetic:android-database-sqlcipher kutubxonasidan SupportFactory dan foydalaning, shifrlash parolini uzating. Diskdagi barcha ma'lumotlar DAO so'rovlari uchun shaffof tarzda shifrlanadi.

Xulosa

  • Room — SQL-ni kompilyatsiya bosqichida tekshirish bilan SQLite uchun Jetpack ORM kutubxonasi.
  • @Entity jadvalni tavsiflaydi, @PrimaryKey — identifikatorni, @ColumnInfo — ustun nomini.
  • @Dao ma'lumotlarga kirish uchun @Query, @Insert, @Update va @Delete bilan metodlarni o'z ichiga oladi.
  • RoomDatabase Entity va DAO-ni birlashtiradi, Room.databaseBuilder orqali yaratiladi.
  • Migratsiyalar (Migration) ma'lumot yo'qotmasdan sxemani o'zgartirish uchun SQL skriptlarini tavsiflaydi.
  • Room mahalliy ravishda Kotlin Coroutines (suspend) va Flow-ni reaktiv UI yangilanishlari uchun qo'llab-quvvatlaydi.
  • Katta ro'yxatlar uchun sahifama-sahifa yuklash uchun Room bilan Paging 3-dan PagingSource orqali foydalaning.

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.

Loyihani muhokama qilish

Shuningdek o'qing