Создание базы данных комнат Android - Обратный звонок - PullRequest
0 голосов
/ 11 октября 2018

Я использую Android Room в своем проекте, и я столкнулся со следующим вопросом:

  • Гарантируется ли обратный вызов при создании базы данных Room (RoomDatabase.Callback#onCreate) всегда называться ?Если это так, безопасно ли выполнять запросы вставки в этом обратном вызове для предварительного заполнения базы данных - запросы, которые, если они не будут выполнены, будут вызывать сбой приложения при каждом его открытии пользователем?

Причина, по которой я спрашиваю этопотому что в настоящее время я делаю именно это в своем приложении.Я использую этот обратный вызов для предварительного заполнения своей базы данных, но я вижу, что с некоторыми пользователями постоянно происходят сбои.Сбои возникают, когда приложение пытается получить одну из этих предварительно заполненных данных, но они не существуют (возвращается 0 строк).


fun getInstance(context: Context): MyDatabaseClass {
    if (isDeletingDatabase) throw DeletingDatabaseException()
    if (instance == null) {
        instance = Room
                .databaseBuilder(context, MyDatabaseClass::class.java, MyDatabaseClass.DB_NAME)
                .addCallback(object : RoomDatabase.Callback() {
                    override fun onCreate(db: SupportSQLiteDatabase) {
                        onDbCreated(db)
                    }
                })
                .addMigrations(
                        Migration_1_2,
                        Migration_2_3
                )
                .build()
    }
    return instance!!
}

1 Ответ

0 голосов
/ 19 июля 2019

Всегда ли вызывается обратный вызов для создания базы данных 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 все необходимые миграции, которые могут понадобиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...