Sobes.tech
Middle

Чӣ гуна шумо ба сохтани базаи додаҳо барои барномаи мобилӣ мебудед?

sobes.tech AI

Ҷавоб аз AI

Барои эҷоди базаи маълумоти маҳаллӣ дар Android, ман истифода мекардам Room Persistence Library.

Ин як абстраксия дар болои SQLite мебошад, ки кор бо базаи маълумотро содда мекунад, бо API-ҳои аннотатсияшуда барои сохтани схемҳо, пурсишҳо ва идоракунии миграцияҳо.

Қадамҳои асосӣ:

  1. Илова кардани вобастагиҳо:

    // Дар build.gradle (дар сатҳи барнома)
    dependencies {
        implementation("androidx.room:room-runtime:2.6.1")
        annotationProcessor("androidx.room:room-compiler:2.6.1") // Барои Java
        kapt("androidx.room:room-compiler:2.6.1") // Барои Kotlin
        implementation("androidx.room:room-ktx:2.6.1") // Барои корутинҳо
    }
    
  2. Эҷоди объектҳои (Entities): POJO ё синфҳои маълумот, ки ҷадвалҳоро дар базаи маълумот намояндагӣ мекунанд. Анотатсияҳои @Entity, @PrimaryKey, @ColumnInfo барои муайян кардани сохтор истифода мешаванд.

    @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 Objects): Интерфейсҳо, ки усулҳои дастрасӣ ба маълумотро муайян мекунанд (вуруди, хориҷ кардан, навсозӣ, пурсишҳо). Анотатсияҳои @Dao, @Insert, @Delete, @Update, @Query барои амалҳо истифода мешаванд.

    @Dao
    interface UserDao {
        @Query("SELECT * FROM users")
        fun getAll(): List<User>
    
        @Insert
        fun insertAll(vararg users: User)
    
        @Delete
        fun delete(user: User)
    }
    
  4. Эҷоди синфи базаи маълумот: Синфи абстрактӣ, ки аз RoomDatabase мерос мегирад, дастрасӣ ба DAO-ро таъмин мекунад ва схемаи базаи маълумотро муайян мекунад. Анотатсияҳои @Database барои нишон додани объектҳо ва версияи база истифода мешаванд.

    @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. Кормак бо базаи маълумот: Дастрасӣ ба намунаи базаи маълумот ва иҷрои амалҳо тавассути DAO.

    val db = AppDatabase.getDatabase(applicationContext)
    val userDao = db.userDao()
    
    // Вуруд кардани маълумот (одатан дар ҷараёни пасзамина)
    GlobalScope.launch {
        userDao.insertAll(User(firstName = "John", lastName = "Doe"))
    }
    
    // Гирифтани маълумот
    GlobalScope.launch {
        val users = userDao.getAll()
    }
    

Афзалиятҳои Room:

  • Таҳқиқи пурсишҳо дар вақти компилятсия: Пурсишҳои SQL дар вақти компилятсия санҷида мешаванд, ки хатогиҳои иҷроиро кам мекунад.
  • Кори осон бо сӯрохиҳо: Интегратсия бо корутинҳо ё LiveData кори бо маълумот дар ҷараёни пасзаминаро осон мекунад.
  • Мигратсияҳои осонтар: Воситаҳо барои идоракунии тағирот дар схемаи база пешниҳод мекунад.
  • Кодекодии boilerplate камтар: нисбат ба SQLite нативӣ.

Агар талаботҳо хеле махсус ё хурд бошанд, истифодаи Shared Preferences барои ҷуфтҳои оддӣ key-value мумкин аст, аммо барои маълумоти сохторӣ ва пурсишҳо Room интихоби беҳтарин аст. Барои сценарияҳои мураккаб бо эҳтиёҷ ба ҳамоҳангсозӣ ё дастрасӣ аз манбаъҳои гуногун (масалан, веб), истифодаи базаи маълумоти облак, мисли Firebase Realtime Database ё Firestore, низ мумкин аст, аммо барои нигоҳдории маҳаллӣ, Room қарор ва тавсия дода мешавад.