Как заставить виртуальное устройство Android забыть версию базы данных моего приложения

У меня есть приложение с предварительно заполненной базой данных (я использую 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). После запуска новой базы данных проблема исчезла.


person Алексей Пермяков    schedule 17.03.2021    source источник
comment
Возможно, стирая устройство, дублируйте виртуальную машину, если у вас есть какие-либо данные, которые вы хотите сохранить (вы можете сделать это в диспетчере AVD), для получения дополнительной информации см. здесь stackoverflow.com/questions/19180883/.   -  person Rabbitminers    schedule 17.03.2021