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:
-
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 } -
Kreiranje entiteta (Entities): POJO ili klase podataka koje predstavljaju tabele u bazi. Anotacije
@Entity,@PrimaryKey,@ColumnInfokoriste 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? ) -
Kreiranje DAO (Data Access Objects): Interfejsi koji definišu metode pristupa podacima (ubacivanje, brisanje, ažuriranje, upiti). Anotacije
@Dao,@Insert,@Delete,@Update,@Querykoriste 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) } -
Kreiranje klase baze podataka: Apstraktna klasa koja nasleđuje
RoomDatabase, pruža pristup DAO i definiše šemu baze. Anotacija@Databasekoristi 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 } } } } -
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.