Миграция помещения, которая добавляет аннотацию @NonNull только к первичному ключу в нескольких таблицах - PullRequest
0 голосов
/ 11 октября 2019

Я обновляю приложение с таргетинга sdk 25 до таргетинга sdk 29 , все таблицы в базе данных моей комнаты имеют аннотацию @PrimaryKey, но не были аннотированы @NonNull. Теперь, когда я нацелился на SDK 29, комната требует аннотации @NonNull, что, к сожалению, приводит к сбою моего приложения при запуске, если я не сделаю новую установку.

Ошибка, которую это вызывает без новой установки :

java.lang.RuntimeException: An error occurred while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:318)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
    at java.lang.Thread.run(Thread.java:761)
 Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase:

Я подумал, что это потому, что мою базу данных пришлось перенести, потому что она работает при новой установке.

До сих пор я нашел несколько полезных ответов о переполнении стека, таких как one .

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

Есть ли более простой способ выполнить миграцию помещения, где я просто добавляю аннотацию @NonNull для всехмои первичные ключи?

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

Пример класса после добавления тега NonNull:

@Entity(tableName = "FavoriteTrip"
    , indices = { @Index("tripPlanId") }
    , foreignKeys = @ForeignKey(entity = TripPlan.class, parentColumns = "id", childColumns = "tripPlanId"))
public class FavoriteTrip {

    @PrimaryKey @NonNull
    private String id = UUID.randomUUID().toString();

1 Ответ

0 голосов
/ 12 октября 2019

Есть ли более простой способ выполнить перенос комнаты, где я просто добавляю аннотацию @NonNull ко всем моим первичным ключам?

Я считаю, что есть, но на самом деле не игралис этим столько (просто быстрый набег и обнаружил, что вы все еще можете создать сущности для правильного соответствия таблицам) . Это значит, что ROOM может преобразовать базу данных (вам, возможно, придется удалить room_master_table ), то есть использовать один из недавно добавленных createFrom методов.

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

Другой вариант - это что-тоЯ играл с ним, который конвертирует базы данных и дополнительно генерирует базовый код Entitity / Dao и Database (Java). Этот инструмент можно найти по адресу RoomExistingSQLiteDBConverter , который имеет ссылки на источник на github.

  • В качестве очень быстрого обзора,

: -

  1. вы запускаете приложение (возможно, в эмуляторе AS, хотя может быть и на реальном устройстве).

  2. Скопируйте базу данных в любую (зарезервированная папка 1) папку в общем внешнем хранилище (до или во время работы приложения, если в последнем случае нажмите кнопку обновления).

  3. Посмотрите на различные перечисленные компоненты для выявления потенциальных проблем.
  4. Когда вы счастливы, нажмите кнопку Преобразовать.
  5. Скопируйте базу данных, готовую для импорта (обычно в видеАктив в папку активов) в приложение, которое разрабатывается / изменяется.
  6. Скопируйте код в соответствующие папки в приложении.
  7. Отредактируйте код, чтобы внести соответствующий импорт.
  8. Введите код для копирования базы данных из папки ресурсов.
  9. Test.
...