我正在应用中使用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()
}
}
}
这是数据库实例的吸气剂:-
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) {
}
}
第一次,一切正常。升级数据库版本时,我正在删除旧文件,复制新文件,但是Room返回了旧数据。 我不确定是什么问题。
我什至尝试了一些较旧的答案,提示:
还尝试了Git的其他一些方法,但是没有一个起作用。 可能是什么问题?我需要的是每次数据库版本升级时都用新数据库替换旧数据库。