Я пытаюсь использовать Kotlin для:
- предварительно заполнить базу данных комнат в моем приложении из существующей базы данных SQL.
- разрешить пользователю обновлять данные.
- разрешить сохраненным обновленным данным только для текущей версии.
- получить новую версию flu sh из старых данных и заменить их новыми SQL database.
Вот что я сделал до сих пор:
Я использовал createFromAsset
метод для предварительного заполнения базы данных с помощью вызова fallbackToDestructiveMigration()
следующим образом:
@Database(entities = [MCData::class], version = 1, exportSchema = false)
abstract class MyRoom : RoomDatabase() {
abstract val myDao: MyDao
companion object {
@Volatile
private var INSTANCE: MyRoom? = null
fun getInstance(context: Context): MyRoom {
synchronized(this) {
var instance = INSTANCE
if (instance == null) {
instance = Room.databaseBuilder(
context.applicationContext,
MyRoom::class.java,
"mcdata.db")
.createFromAsset("mydata.db")
.fallbackToDestructiveMigration()
.build()
INSTANCE = instance
}
return instance
}
}
}
Это предварительно заполняет данные и позволяет пользователю изменять их, но обновления данных после первоначального заполнения теряются при перезапуске приложения. Я озадачен этим поведением, потому что похоже, что код использует fallbackToDestructiveMigration()
для обновления sh данных, даже если схема не изменилась (пользователи могут изменять только значения двух существующих столбцов).
Если я удаляю метод fallbackToDestructiveMigration()
, обновления пользователя после первоначального предварительного заполнения сохраняются, но при переустановке приложения с новыми данными база данных не обновляется.
Есть ли способ сохранить данные (включая изменения) в текущей версии, но заменить их новой базой данных SQL с предварительным заполнением при установке новой версии?