Android Room数据库迁移未正确处理

时间:2019-12-12 04:33:57

标签: android android-room android-assets

在我的应用程序中,我正在使用Room数据库。为了支持脱机功能,我需要使用预先填充的数据库。

所以,我需要的是,我创建了一个带有值的Room数据库,并将该数据库放在项目的资产文件夹中,并将该数据库导入本地。

现在一切正常。

现在,由于某种原因,我要在本地数据库中再添加一列(而不是资产文件夹中的外部数据库),但这会给我以下错误。

  

java.lang.IllegalStateException:迁移未正确处理

我还添加了迁移。

以下是我的数据库代码。

@Database(
entities = arrayOf(ModelCategories::class, ModelApps::class),
version = 4,
exportSchema = false)

abstract class LauncherDatabase : RoomDatabase() {

abstract fun categoriesDAO(): DAOCategories
abstract fun appsDAO(): DAOApps

companion object {
    // Singleton prevents multiple instances of database opening at the
    // same time.
    @Volatile
    private var INSTANCE: LauncherDatabase? = null

    /*
        When there is change in Databse structure new migration should be there
     */
    @JvmField
    val MIGRATION_3_2: Migration = object : Migration(3, 4) {
        override fun migrate(database: SupportSQLiteDatabase) {
        }
    }

    fun getDatabase(context: Context): LauncherDatabase {
        val tempInstance = INSTANCE
        if (tempInstance != null) {
            return tempInstance
        }
        synchronized(this) {
            val instance = Room.databaseBuilder(
                context.applicationContext,
                LauncherDatabase::class.java,
                "launcher_database"
            ).createFromAsset("databases/launcher_database.db")
                .addMigrations(LauncherDatabase.MIGRATION_3_2)
                .build()
            INSTANCE = instance
            return instance
        }
    }
}}

注意:-外部资产数据库的数据库版本为3。因此,在向Model类添加一列后,我将当前数据库版本增加为4。

谢谢。

1 个答案:

答案 0 :(得分:1)

您必须编写的内部替代乐趣迁移

database.execSQL("ALTER TABLE your_table_name ADD COLUMN column_name type");

如果是int,则类型为Integer;如果是String或自定义数据类型,则类型为TEXT。如果可以告诉列数据类型,则可以添加实际代码。