Android Room 数据库迁移没有正确处理

标签 android android-room android-assets

在我的应用程序中,我使用的是 Room 数据库。这里为了支持离线功能,我需要使用预填充的数据库。

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

现在一切正常。

现在,出于某种原因,我要向我的本地数据库(不是 Assets 文件夹中的外部数据库)添加一列,但它给了我以下错误。

java.lang.IllegalStateException: Migration didn't properly handle

我还添加了迁移。

以下是我的数据库代码。

@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
        }
    }
}}

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

提前致谢。

最佳答案

在 override fun migrate 里面你必须写

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

如果是 int,则类型将是 Integer,如果是 String,则类型将是 TEXT 或自定义数据类型等。如果您能告诉您的列数据类型,那么我可以添加实际代码。

关于Android Room 数据库迁移没有正确处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59297761/

相关文章:

java - Integer.parseInt 重新格式化字符串?

Android - 错误 :A prblem occurred configuring project ':app'

Android Room 数据库文件为空 - .db、.db-shm、.db-wal

android - Room 不能选择一个构造函数,因为多个构造函数是合适的错误

android - 如何解析 Kotlin 中 Room 库的注解?

Android AssetManager/InputStream 异常

java - Xml反序列化ValueRequiredException

android - 如何从 Firebase 存储下载图像文件到 SD 卡

android - 如何在 Android 中编辑 assets 文件夹中的文本文件?

java - 对于放置在 Android 应用程序 Assets 文件夹中的文件,JNI C 代码中的 fopen 失败