fix: bump Room DB to version 3 with safe migrations from v1 and v2

This commit is contained in:
Paweł Orzech 2026-03-19 11:31:22 +01:00
parent 48127bffbe
commit aaebc61156
No known key found for this signature in database

View file

@ -9,7 +9,7 @@ import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
import com.swoosh.microblog.data.model.LocalPost
@Database(entities = [LocalPost::class], version = 2, exportSchema = false)
@Database(entities = [LocalPost::class], version = 3, exportSchema = false)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
@ -19,17 +19,29 @@ abstract class AppDatabase : RoomDatabase() {
@Volatile
private var INSTANCE: AppDatabase? = null
val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL("ALTER TABLE local_posts ADD COLUMN imageAlt TEXT DEFAULT NULL")
db.execSQL("ALTER TABLE local_posts ADD COLUMN featured INTEGER NOT NULL DEFAULT 0")
db.execSQL("ALTER TABLE local_posts ADD COLUMN tags TEXT NOT NULL DEFAULT '[]'")
db.execSQL("ALTER TABLE local_posts ADD COLUMN imageUris TEXT DEFAULT NULL")
db.execSQL("ALTER TABLE local_posts ADD COLUMN uploadedImageUrls TEXT DEFAULT NULL")
db.execSQL("ALTER TABLE local_posts ADD COLUMN accountId TEXT NOT NULL DEFAULT ''")
private fun addColumnsIfMissing(db: SupportSQLiteDatabase) {
// Safely add columns - ignore if they already exist
val columns = listOf(
"ALTER TABLE local_posts ADD COLUMN imageAlt TEXT DEFAULT NULL",
"ALTER TABLE local_posts ADD COLUMN featured INTEGER NOT NULL DEFAULT 0",
"ALTER TABLE local_posts ADD COLUMN tags TEXT NOT NULL DEFAULT '[]'",
"ALTER TABLE local_posts ADD COLUMN imageUris TEXT DEFAULT NULL",
"ALTER TABLE local_posts ADD COLUMN uploadedImageUrls TEXT DEFAULT NULL",
"ALTER TABLE local_posts ADD COLUMN accountId TEXT NOT NULL DEFAULT ''"
)
for (sql in columns) {
try { db.execSQL(sql) } catch (_: Exception) { /* column already exists */ }
}
}
val MIGRATION_1_3 = object : Migration(1, 3) {
override fun migrate(db: SupportSQLiteDatabase) = addColumnsIfMissing(db)
}
val MIGRATION_2_3 = object : Migration(2, 3) {
override fun migrate(db: SupportSQLiteDatabase) = addColumnsIfMissing(db)
}
fun getInstance(context: Context): AppDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
@ -37,7 +49,7 @@ abstract class AppDatabase : RoomDatabase() {
AppDatabase::class.java,
"swoosh_database"
)
.addMigrations(MIGRATION_1_2)
.addMigrations(MIGRATION_1_3, MIGRATION_2_3)
.fallbackToDestructiveMigration()
.build()
INSTANCE = instance