У меня есть приложение с предварительно заполненной базой данных (я использую Room, Kotlin). Класс базы данных:
@Database(
entities = [FurnitureModel::class, ImageModel::class],
version = Database.VERSION,
exportSchema = true
)
abstract class Database : RoomDatabase() {
abstract val furnitureDao: FurnitureDao
abstract val imageDao: ImageDao
companion object {
const val NAME = "application-data"
const val VERSION = 3
@Volatile
private var instance: Database? = null
fun getInstance(context: Context): Database {
synchronized(this) {
var inst = instance
if (inst == null) {
inst = Room.databaseBuilder(
context.applicationContext,
Database::class.java,
"$NAME-local.db"
)
.fallbackToDestructiveMigration()
.createFromAsset("$NAME.db")
.build()
instance = inst
}
return inst
}
}
}
}
Это работало нормально. Однажды я решил обновить некоторые данные внутри базы данных. Никаких изменений структуры, просто добавление и изменение некоторых данных. Для версий я изменил константу VERSION с 3 на 4. Когда я запускаю приложение, у меня есть пустая база данных. Насколько я понимаю, в нескольких случаях можно получить пустую базу данных с помощью fallbackToDestructiveMigration. Я мог ошибиться где-то в данных. Чтобы получить более подробную информацию, я решил запустить приложение без предустановленной предыдущей версии. Чистая установка, если можно так сказать. Для этого я стер данные для виртуального устройства в AVD Manager, удалил каталоги сборки в каталогах приложений и приложений и запустил «Invalidate cache/restart...» в Android Studio (я знаю, что в этом нет необходимости). Но результат всегда один и тот же: пытаясь установить свое приложение, я всегда получаю ошибку
Caused by: java.lang.IllegalStateException: A migration from 3 to 4 was required but not found. Please provide the necessary Migration path via RoomDatabase.Builder.addMigration(Migration ...) or allow for destructive migrations via one of the RoomDatabase.Builder.fallbackToDestructiveMigration* methods.
Как я понимаю, ошибка не должна показываться при первой установке приложения. Но это показано. Я попытался создать новое виртуальное устройство и запустить там приложение, но ошибка осталась. Что мне делать, чтобы заставить Android Studio забыть, что приложение было установлено раньше? Спасибо.
UPD1: мне не нужно хранить какие-либо данные, я хочу удалить все данные из предыдущих версий приложения. Но после стирания данных он все еще работает, как будто я его не стирал. Это проблема.
РЕЗУЛЬТАТ: я обнаружил, что проблема была в предварительно заполненной базе данных. К сожалению, я не могу найти, что это не так с базой данных. Я отключил создание базы данных из активов, запустил приложение, чтобы комната создала пустую базу данных, скопировала базу данных из эмулятора и сравнила каждую таблицу с моей базой данных. Никакой разницы. Поэтому, чтобы решить проблему, я просто переместил все данные в каждой таблице в одну и ту же таблицу в новой пустой базе данных (используя DataGrid). После запуска новой базы данных проблема исчезла.