【发布时间】:2020-02-09 04:38:48
【问题描述】:
我正在将应用程序从定位 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();
【问题讨论】:
标签: java android sqlite database-migration android-room