Java 仅向多个表上的主键添加@NonNull注释的文件室迁移
我正在将一个应用程序从targetingsdk25升级到targetingsdk29,我房间数据库中的所有表都有@PrimaryKey注释,但没有使用@NonNull注释。现在我的目标是sdk 29,room需要@NonNull注释,不幸的是,这会导致我的应用程序在启动时崩溃,除非我重新安装 在没有新安装的情况下导致的错误:Java 仅向多个表上的主键添加@NonNull注释的文件室迁移,java,android,sqlite,database-migration,android-room,Java,Android,Sqlite,Database Migration,Android Room,我正在将一个应用程序从targetingsdk25升级到targetingsdk29,我房间数据库中的所有表都有@PrimaryKey注释,但没有使用@NonNull注释。现在我的目标是sdk 29,room需要@NonNull注释,不幸的是,这会导致我的应用程序在启动时崩溃,除非我重新安装 在没有新安装的情况下导致的错误: java.lang.RuntimeException: An error occurred while executing doInBackground() at
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:
我想这是因为我的数据库必须迁移,因为它可以在新安装时运行
到目前为止,我已经找到了一些有用的堆栈溢出的答案,比如这样
但这需要我重写数据库中的每一个表,并确保将所有索引都带过来。我不想这样做,因为我肯定我会错过一些东西,它会创建多个错误
是否有一种更简单的方法来执行房间迁移,我只需将@NonNull注释添加到所有主键
或者,我看到有人提到从SQLite表中获取模式,将所有索引封装到一个查询中,但我不知道如何在迁移中获取该模式
添加非空标记后的示例类:
@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();
是否有一种更简单的方法来执行房间迁移,我只需将@NonNull注释添加到所有主键
我相信有,但实际上还没有玩那么多(只是一次快速的尝试,发现您仍然需要创建实体来正确匹配表)。这是为了让ROOM转换数据库(您可能必须删除ROOM\u master\u表),也就是使用最近添加的createFrom方法之一
- -
- 作为一个非常快速的概述