Sobes.tech
Middle

Mobil ilova uchun ma'lumotlar bazasini qanday yaratardingiz?

sobes.tech AI

AIdan javob

Androidda mahalliy ma'lumotlar bazasini yaratish uchun men Room Persistence Library dan foydalanardim.

Bu SQLite ustidan abstraktsiya bo'lib, sxemalar, so'rovlar va migratsiyalarni boshqarish uchun anotatsiyalangan API taqdim etadi.

Asosiy bosqichlar:

  1. Qaramliklarni qo'shish:

    // build.gradle (ilova darajasida)
    dependencies {
        implementation("androidx.room:room-runtime:2.6.1")
        annotationProcessor("androidx.room:room-compiler:2.6.1") // Java uchun
        kapt("androidx.room:room-compiler:2.6.1") // Kotlin uchun
        implementation("androidx.room:room-ktx:2.6.1") // Coroutine uchun
    }
    
  2. Entitilar (Entities) yaratish: POJO (Plain Old Java Object) yoki ma'lumotlar sinflari, ular ma'lumotlar bazasidagi jadvallarni ifodalaydi. @Entity, @PrimaryKey, @ColumnInfo anotatsiyalari strukturani belgilash uchun ishlatiladi.

    @Entity(tableName = "users")
    data class User(
        @PrimaryKey(autoGenerate = true) val id: Int = 0,
        @ColumnInfo(name = "first_name") val firstName: String?,
        @ColumnInfo(name = "last_name") val lastName: String?
    )
    
  3. DAO (Data Access Object) yaratish: Ma'lumotlarga kirish metodlarini belgilovchi interfeyslar (kiritish, o'chirish, yangilash, so'rovlar). @Dao, @Insert, @Delete, @Update, @Query anotatsiyalari ishlatiladi.

    @Dao
    interface UserDao {
        @Query("SELECT * FROM users")
        fun getAll(): List<User>
    
        @Insert
        fun insertAll(vararg users: User)
    
        @Delete
        fun delete(user: User)
    }
    
  4. Ma'lumotlar bazasi sinfi yaratish: RoomDatabase dan meros olgan abstrakt sinf, DAO ga kirishni ta'minlaydi va ma'lumotlar bazasining sxemasini belgilaydi. @Database anotatsiyasi entitilar va versiyani ko'rsatadi.

    @Database(entities = [User::class], version = 1)
    abstract class AppDatabase : RoomDatabase() {
        abstract fun userDao(): UserDao
    
        companion object {
            @Volatile
            private var INSTANCE: AppDatabase? = null
    
            fun getDatabase(context: Context): AppDatabase {
                return INSTANCE ?: synchronized(this) {
                    val instance = Room.databaseBuilder(
                        context.applicationContext,
                        AppDatabase::class.java,
                        "app_database"
                    ).build()
                    INSTANCE = instance
                    instance
                }
            }
        }
    }
    
  5. Ma'lumotlar bazasi bilan ishlash: Nümunani olish va DAO orqali operatsiyalarni bajarish.

    val db = AppDatabase.getDatabase(applicationContext)
    val userDao = db.userDao()
    
    // Ma'lumotlarni kiritish (odatda fon oqimida)
    GlobalScope.launch {
        userDao.insertAll(User(firstName = "John", lastName = "Doe"))
    }
    
    // Ma'lumotlarni olish
    GlobalScope.launch {
        val users = userDao.getAll()
    }
    

Room ning afzalliklari:

  • So'rovlarni kompilyatsiya vaqtida tekshirish: SQL so'rovlar kompilyatsiya vaqtida tekshiriladi, bu bajarilishdagi xatoliklarni kamaytiradi.
  • Fon oqimlari bilan ishlash oson: Coroutine yoki LiveData bilan integratsiya fon oqimida ma'lumotlar bilan ishlashni soddalashtiradi.
  • Migratsiya qilish osonroq: sxema o'zgarishlarini boshqarish uchun vositalar taqdim etadi.
  • Nativ SQLite ga nisbatan kamroq shablon kodi.

Agar talablar juda maxsus yoki kichik bo'lsa, Shared Preferences ni oddiy kalit-qiymat juftliklari uchun ishlatish mumkin, lekin strukturali ma'lumotlar va so'rovlar uchun Room afzal. Murakkabroq holatlar uchun, sinxronizatsiya yoki turli manbalardan (masalan, veb) kirish ehtiyoji bo'lsa, Firebase Realtime Database yoki Firestore kabi bulut bazalarini ko'rib chiqish mumkin, ammo mahalliy saqlash uchun Room standart va tavsiya etilgan yechimdir.