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:
-
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 } -
Vytvorenie entít (Entities): POJO alebo dátové triedy reprezentujúce tabuľky v databáze. Anotácie
@Entity,@PrimaryKey,@ColumnInfosa 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? ) -
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,@Querysa 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) } -
Vytvorenie triedy databázy: Abstraktná trieda, ktorá dedí z
RoomDatabase, poskytuje prístup k DAO a definuje schému databázy. Anotácia@Databasesa 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 } } } } -
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.