Sobes.tech
Middle

Kako biste kreirali bazu podataka za mobilnu aplikaciju?

sobes.tech АИ

Одговор од АИ

Za kreiranje lokalne baze podataka na Androidu, koristio bih Room Persistence Library.

Ovo je apstrakcija nad SQLite-om koja pojednostavljuje rad sa bazom podataka, pružajući anotirani API za kreiranje šema, upite i upravljanje migracijama.

Glavni koraci:

  1. Dodavanje zavisnosti:

    // U build.gradle (na nivou aplikacije)
    dependencies {
        implementation("androidx.room:room-runtime:2.6.1")
        annotationProcessor("androidx.room:room-compiler:2.6.1") // Za Java
        kapt("androidx.room:room-compiler:2.6.1") // Za Kotlin
        implementation("androidx.room:room-ktx:2.6.1") // Za korutine
    }
    
  2. Kreiranje entiteta (Entities): POJO ili klase podataka koje predstavljaju tabele u bazi. Anotacije @Entity, @PrimaryKey, @ColumnInfo koriste se za definisanje strukture.

    @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. Kreiranje DAO (Data Access Objects): Interfejsi koji definišu metode pristupa podacima (ubacivanje, brisanje, ažuriranje, upiti). Anotacije @Dao, @Insert, @Delete, @Update, @Query koriste se za operacije.

    @Dao
    interface UserDao {
        @Query("SELECT * FROM users")
        fun getAll(): List<User>
    
        @Insert
        fun insertAll(vararg users: User)
    
        @Delete
        fun delete(user: User)
    }
    
  4. Kreiranje klase baze podataka: Apstraktna klasa koja nasleđuje RoomDatabase, pruža pristup DAO i definiše šemu baze. Anotacija @Database koristi se za označavanje entiteta i verzije baze.

    @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. Rad sa bazom podataka: Dobijanje instance baze i izvršavanje operacija putem DAO.

    val db = AppDatabase.getDatabase(applicationContext)
    val userDao = db.userDao()
    
    // Ubacivanje podataka (obično u pozadinskom thread-u)
    GlobalScope.launch {
        userDao.insertAll(User(firstName = "John", lastName = "Doe"))
    }
    
    // Dobijanje podataka
    GlobalScope.launch {
        val users = userDao.getAll()
    }
    

Prednosti Room-a:

  • Provera upita tokom kompilacije: SQL upiti se proveravaju tokom vremena kompilacije, smanjujući greške u izvršenju.
  • Lako rad sa nitima: Integracija sa korutinama ili LiveData olakšava rad sa podacima u pozadinskom thread-u.
  • Jednostavnija migracija: Pruža alate za upravljanje promenama šeme baze.
  • Manje šablonskog koda u poređenju sa nativnim SQLite-om.

Ako su zahtevi veoma specifični ili veoma mali, može se razmotriti korišćenje Shared Preferences za jednostavne key-value parove, ali za strukturirane podatke i upite, Room je preferirani izbor. Za složenije scenarije sa potrebom za sinhronizacijom ili pristupom iz različitih izvora (npr. web), može se razmotriti korišćenje cloud baza podataka poput Firebase Realtime Database ili Firestore, ali za lokalno skladištenje, Room je standardno i preporučeno rešenje.