Комната попытки заново открыть уже закрытую базу данных

При использовании Room из компонентов архитектуры Android я получил следующую ошибку при попытке доступа к базе данных с помощью компонента Dagger:

java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: (database path)

Я использовал версию Dagger 2.11 и номер версии 1.0.0-alpha7, Ошибка была воспроизведена на версии 1.0.0-alpha5,

Эта ошибка возникала при любой попытке доступа к базе данных через DAO после инициализации базы данных и внедрения ее в мой класс.

3 ответа

Решение

Это потому, что вы пытаетесь изменить схему существующей базы данных, не предоставляя ей никакой информации о миграции. Таким образом, в основном он пытается записать новую схему базы данных в существующую БД, которая не работает.

Есть два способа обойти это. Если вы находитесь в своей среде разработки, то вы можете вернуться к разрушительной миграции, для этого ваш код создания базы данных будет выглядеть примерно так:

MyDatabase myDatabase = Room.databaseBuilder(context, MyDatabase.class, "my-db")
    .fallbackToDestructiveMigration()
    .build();

Это означает, что когда вы предоставляете базу данных с обновленной или новой сущностью, она будет делать то, что сказал ответ @huw, и просто удалит базу данных при установке приложения, удалив все данные из нее, и даст вам новую установку.

Другой метод заключается в использовании функции миграции. Они довольно длинные, поэтому, если кто-то не захочет, чтобы я написал это здесь, я оставлю это сейчас, но в основном документацию можно найти здесь:

Документация по переносу БД комнаты

По сути, это приводит к тому, что БД запускает некоторый SQL, предоставленный вами для обновления базы данных до новой версии. Таким образом, вы можете гарантировать, что ни одна из ваших данных не будет потеряна при выполнении миграции; или как можно меньше в зависимости от того, что вы делаете. Это предпочтительный метод для производственных приложений, так как это означает, что пользователи не потеряют свои ранее существующие данные, и вы не получите много сердитых отзывов / потерянных клиентов.

Надеюсь, что это помогает!

Одним из решений этой проблемы было удаление файла базы данных и запуск заново. Это не было проблемой, так как я только тестировал и мог пополнять базу данных, используя онлайн данные.

Для этого либо:

  • Информация о приложении> Хранение> Очистить данные
  • Удалите файл вручную /data/data/com.app.example/databases/database.db

У меня было такое исключение после не очень успешной миграции. Всегда дважды проверяйте SQL-запрос, который вы используете для миграции. Вы можете создать новый столбец с неверным типом данных, и описание исключения не поможет.

Другие вопросы по тегам