Sobes.tech
Middle

Ako by ste vytvorili databázu pre mobilnú aplikáciu?

sobes.tech AI

Odpoveď od AI

Pre vytvorenie miestnej databázy na Androide by som použil Room Persistence Library.

Ide o abstrakciu nad SQLite, ktorá zjednodušuje prácu s databázou, poskytujúc anotované API na tvorbu schém, dotazy a správu migrácií.

Hlavné kroky:

  1. Pridanie závislostí:

    // V build.gradle (na úrovni aplikácie)
    dependencies {
        implementation("androidx.room:room-runtime:2.6.1")
        annotationProcessor("androidx.room:room-compiler:2.6.1") // Pre Java
        kapt("androidx.room:room-compiler:2.6.1") // Pre Kotlin
        implementation("androidx.room:room-ktx:2.6.1") // Pre coroutine
    }
    
  2. Vytvorenie entít (Entities): POJO alebo dátové triedy reprezentujúce tabuľky v databáze. Anotácie @Entity, @PrimaryKey, @ColumnInfo sa používajú na definovanie štruktúry.

    @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. Vytvorenie DAO (Data Access Objects): Rozhrania, ktoré definujú metódy prístupu k dátam (vkladanie, mazanie, aktualizácia, dotazy). Anotácie @Dao, @Insert, @Delete, @Update, @Query sa používajú na operácie.

    @Dao
    interface UserDao {
        @Query("SELECT * FROM users")
        fun getAll(): List<User>
    
        @Insert
        fun insertAll(vararg users: User)
    
        @Delete
        fun delete(user: User)
    }
    
  4. Vytvorenie triedy databázy: Abstraktná trieda, ktorá dedí z RoomDatabase, poskytuje prístup k DAO a definuje schému databázy. Anotácia @Database sa používa na označenie entít a verzie databázy.

    @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. Práca s databázou: Získanie inštancie databázy a vykonávanie operácií cez DAO.

    val db = AppDatabase.getDatabase(applicationContext)
    val userDao = db.userDao()
    
    // Vkladanie dát (zvyčajne v pozadí)
    GlobalScope.launch {
        userDao.insertAll(User(firstName = "John", lastName = "Doe"))
    }
    
    // Získanie dát
    GlobalScope.launch {
        val users = userDao.getAll()
    }
    

Výhody Room:

  • Kontrola dotazov počas kompilácie: SQL dotazy sú kontrolované počas kompilácie, čo znižuje počet chýb počas behu.
  • Jednoduchá práca s vláknami: Integrácia s korutinami alebo LiveData uľahčuje prácu s dátami na pozadí.
  • Jednoduchšia migrácia: Poskytuje nástroje na správu zmien schémy databázy.
  • Menej šablónového kódu v porovnaní s natívnym SQLite.

Ak by požiadavky boli veľmi špecifické alebo veľmi malé, mohol by sa zvážiť použitie Shared Preferences pre jednoduché key-value páry, ale pre štruktúrované dáta a dotazy je Room preferovanou voľbou. Pre zložitejšie scenáre s potrebou synchronizácie alebo prístupu z rôznych zdrojov (napríklad webu) je možné zvážiť použitie cloudových databáz, ako Firebase Realtime Database alebo Firestore, ale pre lokálne uloženie je Room štandardné a odporúčané riešenie.