Java 仅向多个表上的主键添加@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

我正在将一个应用程序从targetingsdk25升级到targetingsdk29,我房间数据库中的所有表都有@PrimaryKey注释,但没有使用@NonNull注释。现在我的目标是sdk 29,room需要@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:
我想这是因为我的数据库必须迁移,因为它可以在新安装时运行

到目前为止,我已经找到了一些有用的堆栈溢出的答案,比如这样

但这需要我重写数据库中的每一个表,并确保将所有索引都带过来。我不想这样做,因为我肯定我会错过一些东西,它会创建多个错误

是否有一种更简单的方法来执行房间迁移,我只需将@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方法之一

  • -
这些将把数据库转换为room可以接受的数据库,但据我所知,它不会创建实体,我已经看到,由于预期的。。。。。。。。。。建立很难读

另一个选项是我一直在使用的,它转换数据库,并另外生成基本的Entity/Dao和数据库代码(Java)。这个工具可以在github上找到源代码的链接

  • 作为一个非常快速的概述
:-

  • 您可以运行该应用程序(可能在AS模拟器中运行,但也可能在真实设备上运行)

  • 将数据库复制到公共外部存储中的任何(bar 1保留文件夹)文件夹中(在应用程序运行之前或运行时,如果是后者,请单击“刷新”按钮)

  • 查看列出的各种组件,了解潜在的突出问题
  • 当您高兴时,单击转换按钮
  • 将准备好导入的数据库复制到正在开发/更改的应用程序(通常作为资产文件夹中的资产)
  • 将代码复制到应用程序中的相应文件夹中
  • 编辑代码以引入适当的导入
  • 编写代码以从资产文件夹复制数据库
  • 测试