Android Room从资产复制数据库在版本更新时未升级

Android Room从资产复制数据库在版本更新时未升级,android,kotlin,android-room,Android,Kotlin,Android Room,我正在应用程序中使用Android Room。我在我需要使用的资产中有一个预构建的数据库。每次更新版本时,我都需要用新数据库替换旧数据库。为此,我用传统的文件IO复制了数据库 private fun copyDatabaseFile(context: Context) { val dbPath = context.getDatabasePath(DB_NAME) if (dbPath.exists() && AppPrefs.getInstance().dataB

我正在应用程序中使用Android Room。我在我需要使用的资产中有一个预构建的数据库。每次更新版本时,我都需要用新数据库替换旧数据库。为此,我用传统的文件IO复制了数据库

private fun copyDatabaseFile(context: Context) {
    val dbPath = context.getDatabasePath(DB_NAME)
    if (dbPath.exists() && AppPrefs.getInstance().dataBaseVersion== DATABASE_VERSION) {
        return
    }
    if(dbPath.delete())Log.e("datacopy", "file deleted")

    dbPath.parentFile.mkdirs()
    try {
        val inputStream = context.assets.open("databases/no_database.db")
        val output = FileOutputStream(dbPath)
        val buffer = ByteArray(8192)
        var length =0
        while ({length = inputStream.read(buffer, 0, 8192); length}() > 0) {
            Log.e("datacopy", "Write")
            output.write(buffer, 0, length)
        }
        output.flush()
        output.close()
        inputStream.close()
        AppPrefs.getInstance().dataBaseVersion= DATABASE_VERSION
    } catch (e: IOException) {
        e.printStackTrace()
    }
}
}
以下是数据库实例的getter:-

 internal fun getDatabase(context: Context): MyDatabase? {
        if (INSTANCE == null) {
            synchronized(MyDatabase::class.java) {
                if (INSTANCE == null) {
                    copyDatabaseFile(context)
                    INSTANCE = Room.databaseBuilder(
                        context.applicationContext,
                        MyDatabase::class.java, DB_NAME)
                        .addMigrations(MyDatabase.MIGRATION_1_2)
                        .build()
                }
            }

        }
        return INSTANCE
    }
迁移现在是空的,因为我需要删除旧的一个副本新的一个。因此,我认为这不需要迁移

@JvmField
    val MIGRATION_1_2: Migration = object : Migration(1, 2) {
        override fun migrate(database: SupportSQLiteDatabase) {


        }
    }
第一次一切正常。当我升级数据库版本时,我正在删除旧文件复制新文件,但文件室正在返回旧数据。 我不确定是什么问题

我甚至尝试了一些更老的答案,建议:

  • 具有预填充数据库的库

  • 还尝试了Git中的一些其他东西,但都不起作用。
    可能是什么问题?我的需要是每次升级数据库版本时用新数据库替换旧数据库

    你在移民课上干什么?什么都没有。。因为我需要删除前一个并复制一个新的。如果你看到旧数据,似乎你没有替换数据库。看到在copyDatabaseFile()方法中设置的日志了吗?Logcat中有例外吗?是的。。我调试了整个复制过程。旧文件将被删除,新文件将被复制。。这就是为什么我左右为难,为什么地狱房间仍然指向旧的。我多次将Sqlite与Asset db一起使用,我将相同的逻辑放在room中,但它似乎不起作用..如果room使用的是
    SQLiteOpenHelper.getReadableDatabase()
    ,正如这所建议的,那么请注意,直到
    getReadableDatabase()时才进行复制
    call-在
    new
    中首次指定db文件时不调用。我在安装应用程序后复制/更新数据库时遇到了类似的问题,直到我意识到这一点,并在
    new
    之后和其他应用程序访问数据库之前强制执行
    getReadableDatabase().close()