Чӣ гуна шумо ба сохтани базаи додаҳо барои барномаи мобилӣ мебудед?
sobes.tech AI
Ҷавоб аз AI
Барои эҷоди базаи маълумоти маҳаллӣ дар Android, ман истифода мекардам Room Persistence Library.
Ин як абстраксия дар болои SQLite мебошад, ки кор бо базаи маълумотро содда мекунад, бо API-ҳои аннотатсияшуда барои сохтани схемҳо, пурсишҳо ва идоракунии миграцияҳо.
Қадамҳои асосӣ:
-
Илова кардани вобастагиҳо:
// Дар 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") // Барои корутинҳо } -
Эҷоди объектҳои (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? ) -
Эҷоди 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) } -
Эҷоди синфи базаи маълумот: Синфи абстрактӣ, ки аз
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 } } } } -
Кормак бо базаи маълумот: Дастрасӣ ба намунаи базаи маълумот ва иҷрои амалҳо тавассути 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 қарор ва тавсия дода мешавад.