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 androidx.sqlite.db.SupportSQLiteDatabase
import com.swoosh.microblog.data.model.LocalPost 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) @TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() { abstract class AppDatabase : RoomDatabase() {
@ -19,17 +19,29 @@ abstract class AppDatabase : RoomDatabase() {
@Volatile @Volatile
private var INSTANCE: AppDatabase? = null private var INSTANCE: AppDatabase? = null
val MIGRATION_1_2 = object : Migration(1, 2) { private fun addColumnsIfMissing(db: SupportSQLiteDatabase) {
override fun migrate(db: SupportSQLiteDatabase) { // Safely add columns - ignore if they already exist
db.execSQL("ALTER TABLE local_posts ADD COLUMN imageAlt TEXT DEFAULT NULL") val columns = listOf(
db.execSQL("ALTER TABLE local_posts ADD COLUMN featured INTEGER NOT NULL DEFAULT 0") "ALTER TABLE local_posts ADD COLUMN imageAlt TEXT DEFAULT NULL",
db.execSQL("ALTER TABLE local_posts ADD COLUMN tags TEXT NOT NULL DEFAULT '[]'") "ALTER TABLE local_posts ADD COLUMN featured INTEGER NOT NULL DEFAULT 0",
db.execSQL("ALTER TABLE local_posts ADD COLUMN imageUris TEXT DEFAULT NULL") "ALTER TABLE local_posts ADD COLUMN tags TEXT NOT NULL DEFAULT '[]'",
db.execSQL("ALTER TABLE local_posts ADD COLUMN uploadedImageUrls TEXT DEFAULT NULL") "ALTER TABLE local_posts ADD COLUMN imageUris TEXT DEFAULT NULL",
db.execSQL("ALTER TABLE local_posts ADD COLUMN accountId TEXT NOT NULL DEFAULT ''") "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 { fun getInstance(context: Context): AppDatabase {
return INSTANCE ?: synchronized(this) { return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder( val instance = Room.databaseBuilder(
@ -37,7 +49,7 @@ abstract class AppDatabase : RoomDatabase() {
AppDatabase::class.java, AppDatabase::class.java,
"swoosh_database" "swoosh_database"
) )
.addMigrations(MIGRATION_1_2) .addMigrations(MIGRATION_1_3, MIGRATION_2_3)
.fallbackToDestructiveMigration() .fallbackToDestructiveMigration()
.build() .build()
INSTANCE = instance INSTANCE = instance