ассетов готовую, то она у меня будет каждый раз загружаться от туда при запуске приложения, или после первого запуска она загружается в папку data, и потом подгружается только от туда? Вот мой код..
companion object {
fun init(context: Context) =
Room.databaseBuilder(context, EnemiesDatabase::class.java, "EnemiesDatabase")
.createFromAsset("databases/EnemiesDatabase.db")
.fallbackToDestructiveMigration()
.build()
}
Она "подгружается" только один раз после установки/обновы, после чего инициализирует в ней недостающие сущности, если таковые имеются.
При обновлении приложения нужно также учитывать изменения в сущностях/структуре БД, чтобы произвести соответствующую миграцию
Подгружается один раз, это имеется ввиду при запуске приложения, или один раз после первого запуска приложения, а в дальнейшем она подгружается не из ассетов?
При первом запуске один раз
Понял. Значит, у меня подписала загрузка, из-за того, что я корректировал что то в коде, потом стартовал приложение, оно заново инсталлилось, и, получается, после такого обновления база данных из ассетов подгружается заново как в первый раз, да? В таком случае надо миграцию правильно настраивать?
Не совсем понимаю контекст задачи. Нет смысла подгружать БД из ассетов, если в ней заранее нет каких-то данных, кроме самой структуры, а так смотри внимательней когда вносишь изменения в подгружаемый из ассетов файл, особенно при врубленном allowBackup в манифесте. Желательно полностью сносить и заново устанавливать приложение...
Неа, в ассетах заполненная бд. Я имею ввиду, что когда приложение допустим обновляется, то получается, что из ассетов заново подгружается база данных, которая по дефолту туда положена? Просто в таком случае допустим я при первом входе получаю базу данных из ассетов, потом по ходу работы с приложением базу данных скопированную редачу, добавляю данные. А после обновления приложения у меня загружается снова база из ассетов стандартная, и я теряю все данные? Или это не так работает? Может при работе приложения если базу данных редактирую, то она редачится и в ассетах? Или только этот экземпляр бд и есть у нас? Я наверное запутал тебя, но надеюсь что не сильно))
Установил -> рум скопировал бд с ассетов -> обновление приложения -> рум сверяет структуру бд из ассетов с имеющейся: применяет миграцию, если есть различия; если нет, то твоя бд продолжает жить. При миграции данные само собой остаются...
Единственное, не скажу как он поступает, когда обновлены сами данные, а структура остаётся прежней. Скорее всего не будет "актуализировать" по причине сложной "миграции" данных. По сути эта проблема решается через собственные патчи для БД, особенно когда данные таблицы меняются в ходе работы приложения. ИМХО
В таком случае, надо мне почитать про миграции, применить и потестить это все дело. Вообще, думал сделать счётчик, которые будет запуск приложения писать. Если запуска больше одного, то бд будет загружаться, не сверяя ассет. Только не знаю, будет ли такое работать в случае с обновлением приложения. Если хранить данные счётчика в шэрд прэфах, то после обновления они ведь тоже остаются, удаляются только если приложение удалить?
Так или иначе, спасибо. Буду пробовать.
Ещё юзер может удалить shared preferences в любой момент.
Не нужны никакие счётчики, я же сказал, что при обновлении, если СТРУКТУРА бд схожа с той, что имелась на прошлой версии аппы, то всё ок, в противном случае рум будет искать методы миграции, тобою написанные, если они норм отработают, то тоже всё ок будет, все данные с прошлой версии аппы останутся
Понял, спасибо большое за пояснения
https://developer.android.com/training/data-storage/room/prepopulate#migrations тут достаточно хорошо описан процесс миграции при готовой БД в ассетах
Почитаю, спасибо. С миграцией бд ещё не работал, буду осваивать.
Обсуждают сегодня