Tema
/
Mobiliosios programėlės KOTLIN
Pamoka 7 / 14 Room kaip talpykla ~50 min

Room talpykla — Entity, DAO, Database

Trys failai kodo stulpelyje kaip skirtukai, priklausomybių tvarka: MenuItemEntity.ktMenuDao.ktPicaDatabase.kt (eilutė, tada kaip ją skaityti/rašyti, tada bazė, kuri ją laiko).

1. MenuItemEntity.kt — talpyklos eilutė. Ji atskira nuo domeno MenuItem (2 pamoka): esybė gyvena core/data/local (saugojimo sluoksnis), turi @Entity ir @PrimaryKey, o MenuItem lieka švarus modelis, kurį rodo UI. Juos atvaizduojam vienas į kitą.

Pirma pridėk Room priklausomybes build.gradle.kts (stack-when-needed; Room 2.x, ne 3.0):

implementation(libs.androidx.room.runtime)
implementation(libs.androidx.room.ktx)      // Flow + suspend palaikymas
ksp(libs.androidx.room.compiler)            // plugin: id("androidx.room") + id("com.google.devtools.ksp")

2. MenuDao.kt — kaip skaitai ir rašai. Esminė asimetrija: skaitymai grąžina Flow (gyvas srautas — UI persipiešia, kai lentelė pasikeičia), rašymai yra suspend (insertAll, clearAll).

3. PicaDatabase.kt — pati bazė: @Database(entities = [MenuItemEntity::class], version = 1), atskleidžianti menuDao().

Spąstai (schemos migracija). version = 1 — svarbus. Jei vėliau pakeisi esybę (pridėsi stulpelį) ir nepadidinsi versijos, Room mes IllegalStateException apie neatitinkančią schemą. O padidinęs versiją (version = 2) be migracijos gausi:

java.lang.IllegalStateException: A migration from 1 to 2 was required but not found.

Sprendimai: parašyk Migration(1, 2) (išsaugo duomenis) arba — talpyklai — .fallbackToDestructiveMigration() (išmeta ir atkuria; talpyklai tinka, nes serveris yra tiesos šaltinis). Niekada tiesiog nedidink versijos „kad susikompiliuotų".