Room fallbackToDestructive срабатывает каждый раз
Знакомлюсь с Room и пытаюсь собрать небольшой проект читая базу из папки ASSETS.
Столкнулся с таким вопросом:
При однятии версии базы данных выкидывает исключение и просит добавить МИГРАЦИЮ.
Мне же достаточно просто перезаписывать базу из ассетов при поднятии версии.
В доках для этой цели есть метод fallbackToDestructiveMigration()
Но когда я указываю его в билдере по факту моя база данных перезаписывается при каждом старте приложения.
Что мне нужно - ЧТО бы база перезаписывалась из ассетов только при поднятии версии приложения.
и я не пойму как добиться такого поведения. Буду благодарен за помощь.
Вот как я все делаю:
Это простейший пример.
@Dao
NameDao
@Insert(entity = Name.class, onConflict = OnConflictStrategy.REPLACE)
void insertMe(Name name);
Далее база данных:
@Database(version = 2, entities = [Name::class])
abstract class AppDatabase : RoomDatabase() {
abstract fun nameDao(): NameDao
}
POJO
@Entity(tableName = "tips_of_the_day")
data class Name(
@ColumnInfo(name = "name")
var name: String?
) {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "_id")
var id: Int = 0
}
Application
class App : Application() {
private lateinit var appDatabase: AppDatabase
override fun onCreate() {
super.onCreate()
appDatabase = getAppDatabase()
}
fun getAppDatabase(): AppDatabase {
return Room.databaseBuilder(
this,
AppDatabase::class.java, DATABASE_NAME
)
.createFromAsset("database/tips_of_the_day.db")
.fallbackToDestructiveMigration()
.allowMainThreadQueries()
.build().also { appDatabase = it }
}
companion object {
private const val DATABASE_NAME = "tips_of_the_day.db"
}
}
Ну и вот как вычитываю:
val db: AppDatabase = (application as App).getAppDatabase()
val dataBase = db.nameDao()
textView.setOnClickListener(){
val name: Name = Name( "Anton")
dataBase.insertMe(name)
val tableSize: Int = dataBase.all.size
toast("db size : $tableSize")
Log.d("TAG" , "db size : $tableSize")
}
Получается что код работает до момента перезапуска приложения и потом база затирается на дефолт(