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:
-
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 } -
Subjektų (Entities) kūrimas: POJO arba duomenų klasės, atitinkančios lenteles duomenų bazėje.
@Entity,@PrimaryKey,@ColumnInfonaudojami 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? ) -
DAO (Data Access Objects) kūrimas: Sąsajos, apibrėžiančios duomenų prieigos metodus (įterpimas, ištrynimas, atnaujinimas, užklausos).
@Dao,@Insert,@Delete,@Update,@Querynaudojami 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) } -
Duomenų bazės klasės kūrimas: Abstrakti klasė, kuri paveldi
RoomDatabase, teikia prieigą prie DAO ir apibrėžia bazės schemą.@Databaseanotacijos 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 } } } } -
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.