Sobes.tech
Middle

Kaip sukurtumėte duomenų bazę mobiliajam programėlei?

sobes.tech AI

Atsakymas iš AI

Norint sukurti vietinę duomenų bazę Android, aš naudociau Room Persistence Library:

Tai yra abstrakcija virš SQLite, kuri supaprastina darbą su baze, teikdama anotacijomis pažymėtą API schemų, užklausų ir migracijų kūrimui:

Pagrindiniai žingsniai:

  1. Priklausomybių pridėjimas:

    // build.gradle (programos lygmenyje)
    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") // Coroutine
    }
    
  2. Subjektų (Entities) kūrimas: POJO arba duomenų klasės, atitinkančios lenteles duomenų bazėje. @Entity, @PrimaryKey, @ColumnInfo naudojami struktūrai apibrėžti:

    @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) kūrimas: Sąsajos, apibrėžiančios duomenų prieigos metodus (įterpimas, ištrynimas, atnaujinimas, užklausos). @Dao, @Insert, @Delete, @Update, @Query naudojami operacijoms apibrėžti:

    @Dao
    interface UserDao {
        @Query("SELECT * FROM users")
        fun getAll(): List<User>
    
        @Insert
        fun insertAll(vararg users: User)
    
        @Delete
        fun delete(user: User)
    }
    
  4. Duomenų bazės klasės kūrimas: Abstrakti klasė, kuri paveldi RoomDatabase, teikia prieigą prie DAO ir apibrėžia bazės schemą. @Database anotacijos nurodo subjektus ir versiją:

    @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. Darbas su duomenų baze: Gauti bazės egzempliorių ir atlikti operacijas per DAO:

    val db = AppDatabase.getDatabase(applicationContext)
    val userDao = db.userDao()
    
    // Duomenų įterpimas (dažniausiai foniniame sraute)
    GlobalScope.launch {
        userDao.insertAll(User(firstName = "John", lastName = "Doe"))
    }
    
    // Duomenų gavimas
    GlobalScope.launch {
        val users = userDao.getAll()
    }
    

Room privalumai:

  • Užklausų patikrinimas kompiliacijos metu: SQL užklausos tikrinamos kompiliacijos metu, kas sumažina klaidų skaičių.
  • Patogu dirbti su srautais: Integracija su korutinėmis ar LiveData palengvina darbą su duomenimis foniniame režime.
  • Lengvesnė migracija: Teikia įrankius schemos pakeitimų valdymui.
  • Mažiau šabloniško kodo lyginant su natūraliu SQLite.

Jei reikalavimai būtų labai specifiniai arba labai maži, galima apsvarstyti Shared Preferences naudoti paprastoms key-value poroms, tačiau struktūruotiems duomenims ir užklausoms Room yra pageidautinas pasirinkimas. Sudėtingesniems scenarijams, kai reikalinga sinchronizacija ar prieiga iš skirtingų šaltinių (pvz., interneto), galima apsvarstyti debesų duomenų bazes, tokias kaip Firebase Realtime Database ar Firestore, tačiau vietiniam saugojimui Room yra standartinis ir rekomenduojamas sprendimas.