Sobes.tech
Middle

Kuidas te loodaksite andmebaasi mobiilirakenduse jaoks?

sobes.tech AI

Vastus AI-lt

Lai izveidotu vietējo datu bāzi Android, es izmantotu Room Persistence Library:

Šī ir abstrakcija virs SQLite, kas vienkāršo darbu ar datu bāzi, nodrošinot anotētas API saskaņā ar shēmu, vaicājumiem un migrācijām:

Galvenie soļi:

  1. Atkarību pievienošana:

    // build.gradle (lietotnes līmenī)
    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") // Korutīniem
    }
    
  2. Subjektu (Entities) izveide: POJO vai datu klases, kas atbilst tabulām datu bāzē. @Entity, @PrimaryKey, @ColumnInfo tiek izmantoti struktūras definēšanai:

    @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) izveide: Interfeisi, kas definē piekļuves metodes datiem (ievietošana, dzēšana, atjaunināšana, vaicājumi). @Dao, @Insert, @Delete, @Update, @Query tiek izmantoti darbībām:

    @Dao
    interface UserDao {
        @Query("SELECT * FROM users")
        fun getAll(): List<User>
    
        @Insert
        fun insertAll(vararg users: User)
    
        @Delete
        fun delete(user: User)
    }
    
  4. Datu bāzes klases izveide: Abstrakta klase, kas manto no RoomDatabase, nodrošina piekļuvi DAO un definē shēmu. @Database anotācijas norāda subjektus un versiju:

    @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. Darbs ar datu bāzi: Saņemt datu bāzes eksemplāru un veikt operācijas caur DAO:

    val db = AppDatabase.getDatabase(applicationContext)
    val userDao = db.userDao()
    
    // Datu ievietošana (parasti fonā)
    GlobalScope.launch {
        userDao.insertAll(User(firstName = "John", lastName = "Doe"))
    }
    
    // Datu saņemšana
    GlobalScope.launch {
        val users = userDao.getAll()
    }
    

Room priekšrocības:

  • Vaicājumu pārbaude kompilācijas laikā: SQL vaicājumi tiek pārbaudīti kompilācijas laikā, kas samazina kļūdu skaitu.
  • Ērti strādāt ar plūsmām: Integrācija ar korutīniem vai LiveData atvieglo darbu ar datiem fonā.
  • Viegla migrācija: Nodrošina rīkus shēmas izmaiņu pārvaldībai.
  • Mazāk šablonveida koda salīdzinājumā ar nativu SQLite.

Ja prasības ir ļoti specifiskas vai ļoti mazas, var apsvērt Shared Preferences izmantošanu vienkāršām key-value pāriem, bet strukturētiem datiem un vaicājumiem Room ir priekšroka. Sarežģītākos scenārijos, kad nepieciešama sinhronizācija vai piekļuve no dažādiem avotiem (piemēram, tīmekļa), var apsvērt mākoņu datu bāzes, piemēram, Firebase Realtime Database vai Firestore, bet vietējai glabāšanai Room ir standarta un ieteicams risinājums.