Я обновляю приложение с таргетинга 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();