Android Room从资产复制数据库在版本更新时未升级
我正在应用程序中使用Android Room。我在我需要使用的资产中有一个预构建的数据库。每次更新版本时,我都需要用新数据库替换旧数据库。为此,我用传统的文件IO复制了数据库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
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) {
}
}
第一次一切正常。当我升级数据库版本时,我正在删除旧文件复制新文件,但文件室正在返回旧数据。
我不确定是什么问题
我甚至尝试了一些更老的答案,建议:可能是什么问题?我的需要是每次升级数据库版本时用新数据库替换旧数据库 你在移民课上干什么?什么都没有。。因为我需要删除前一个并复制一个新的。如果你看到旧数据,似乎你没有替换数据库。看到在copyDatabaseFile()方法中设置的日志了吗?Logcat中有例外吗?是的。。我调试了整个复制过程。旧文件将被删除,新文件将被复制。。这就是为什么我左右为难,为什么地狱房间仍然指向旧的。我多次将Sqlite与Asset db一起使用,我将相同的逻辑放在room中,但它似乎不起作用..如果room使用的是
SQLiteOpenHelper.getReadableDatabase()
,正如这所建议的,那么请注意,直到getReadableDatabase()时才进行复制
call-在new
中首次指定db文件时不调用。我在安装应用程序后复制/更新数据库时遇到了类似的问题,直到我意识到这一点,并在new
之后和其他应用程序访问数据库之前强制执行getReadableDatabase().close()
。