Всегда ли вызывается обратный вызов для создания базы данных Room (RoomDatabase.Callback # onCreate)?
В соответствии с документацией, он вызывается при первом создании базы данных.после создания всех таблиц.
Один случай, когда onCreate()
не вызывается (хотя можно ожидать, что это произойдет), - это когда миграция на текущую версию не найдена и для fallbackToDestructiveMigration()
установленостроитель БД.В этом случае БД воссоздается без вызова onCreate()
.Является ли это намерением, я не уверен, но в настоящее время это так.
Если это так, безопасно ли выполнять запросы вставки в этом обратном вызове, чтобы предварительно заполнить базу данных - запросы, которые, если не выполнены, будет ли приложение аварийно завершать работу каждый раз, когда пользователь открывает его?
Безопасно заполнять базу данных здесь, предполагая, что она вызывается, когда вы ожидаете, что, как я понимаю, только когдабаза данных создается в первый раз.
Таким образом, если Room не может найти элементы миграции для определенных версий, возможны сбои, если ваше приложение не предназначено для обработки отсутствующих данных.
Мои наблюдения о том, как Room обрабатывает миграции (по состоянию на v2.2.0-alpha01 ):
Согласно документации для addMigrations()
:
Если между текущей версией и последней версией отсутствует элемент миграции, Room очистит базу данных и создаст ее заново.
Это может иметь место, но также выдает следующее недопустимоеStateException:
Миграция с 1 на 2 была обязательной, но не найдена.Укажите необходимый путь миграции с помощью RoomDatabase.Builder.addMigration (Migration ...) или разрешите деструктивные миграции с помощью одного из методов RoomDatabase.Builder.fallbackToDestructiveMigration *.
Если добавить fallbackToDestructiveMigration()
для вашего построителя базы данных, как предполагает исключение, база данных действительно воссоздается (или, по крайней мере, стирается), но onCreate()
не вызывается, поэтому, если ваш код популяции присутствует, у вас не будет данных для вашего приложения.
По этой причине я считаю, что onCreate()
является жизнеспособным вариантом для заполнения вашей базы данных, если вы пообещаете предоставить Room все необходимые миграции, которые могут понадобиться.