Я знакомлюсь с Room и пытаюсь собрать небольшой проект, прочитав базу данных из папки ASSETS . Столкнулся с таким вопросом: когда выбрасывается одна версия базы данных, она выдает исключение и просит добавить MIGRATION. Мне достаточно просто переписать базу данных из ресурсов при поднятии версии. Для этого в доках есть метод fallbackToDestructiveMigration ()
. Но когда я указываю это в компоновщике, фактически моя база данных перезаписывается при каждом запуске приложения. Мне нужно, чтобы база данных перезаписывалась из ресурсов только при повышении версии приложения. и я не понимаю, как добиться этого поведения. Буду признателен за вашу помощь.
Вот как я все делаю:
Это самый простой пример.
DAO:
@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
@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
}
Класс приложения
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")
}
Оказывается, код работает до тех пор, пока приложение не будет перезапущено, а затем база данных будет перезаписана по умолчанию и станет новой (
. Мне не нужно это поведение. Мне нужно сохранять базу данных до тех пор, пока версия не будет запущена. Как этого добиться?