Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 房间迁移到新版本时崩溃_Android_Android Sqlite_Android Room - Fatal编程技术网

Android 房间迁移到新版本时崩溃

Android 房间迁移到新版本时崩溃,android,android-sqlite,android-room,Android,Android Sqlite,Android Room,我有版本为1的表配置文件数据库。现在,我想更改该表并添加文本字段createdAt 我创建了迁移: public static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(@NonNull SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE Profile "+ " ADD COLUMN cre

我有版本为1的表配置文件数据库。现在,我想更改该表并添加文本字段createdAt

我创建了迁移:

public static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override public void migrate(@NonNull SupportSQLiteDatabase database) {
  database.execSQL("ALTER TABLE Profile "+ " ADD COLUMN createdAt TEXT");
}
};
我在这里加上:

 @Provides @Singleton public AppDatabase  provideDatabase(@Named(DIConstants.APP) Context context) {
 return Room.databaseBuilder(context, AppDatabase.class, "appdb")
    .addMigrations(AppDatabase.MIGRATION_1_2)
    .build();
  }
现在,当我运行应用程序时,出现以下错误:

Process: org.app.app.debug, PID: 4800
              java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/user/0/org.app.rapp.debug/databases/appdb
                  at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
                  at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1659)
                  at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1605)
                  at android.arch.persistence.db.framework.FrameworkSQLiteDatabase.execSQL(FrameworkSQLiteDatabase.java:240)
                  at org.app.app.data.sql.AppDatabase$1.migrate(AppDatabase.java:65)
                  at android.arch.persistence.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:73)
                  at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade(FrameworkSQLiteOpenHelper.java:118)
                  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:256)
                  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
                  at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:93)
                  at android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:54)
                  at android.arch.persistence.room.RoomDatabase.inTransaction(RoomDatabase.java:305)
                  at android.arch.persistence.room.InvalidationTracker$1.run(InvalidationTracker.java:281)
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                  at java.lang.Thread.run(Thread.java:818)

尝试将“createdAt”设为null。这对我有用

@Entity(tableName = "RSyncStatus")
data class RSyncStatus(@PrimaryKey(autoGenerate = true)
                       var id: Long? = null,
                       var userObjId: String = "",
                       var syncStatus: Int? = null,
                       var test: String? = null)
我正在使用kotlin。所以我从
var测试
String=”“
var测试
String?=空
终于成功了

我认为在java中是这样的:

private String test = null

尝试将“createdAt”设为null。这对我有用

@Entity(tableName = "RSyncStatus")
data class RSyncStatus(@PrimaryKey(autoGenerate = true)
                       var id: Long? = null,
                       var userObjId: String = "",
                       var syncStatus: Int? = null,
                       var test: String? = null)
我正在使用kotlin。所以我从
var测试
String=”“
var测试
String?=空
终于成功了

我认为在java中是这样的:

private String test = null

我在房间里换桌子时也经历了同样的过程。这些日志根本帮不了你,因为它们没有指向确切的问题。您必须编写测试用例来了解这里到底出了什么问题。您可以按照android文档进行操作,谢谢。我正在试着写测试,我的问题是:你们有并没有经历过这个问题?并没有,我并没有经历过那个问题。您可以做的只是确保在模块中创建了内部资产模式文件。我找不到模式文件。我不知道它为什么不生成它。如果没有生成架构文件,则无法测试迁移本身。您可以尝试的是,删除迁移代码,但在build.gradle中保留room.schemaLocation annotation processor属性&构建项目&检查是否为数据库的第一个版本生成了架构,然后再生成第二个版本。我在room中更改表时也经历了相同的过程。这些日志根本帮不了你,因为它们没有指向确切的问题。您必须编写测试用例来了解这里到底出了什么问题。您可以按照android文档进行操作,谢谢。我正在试着写测试,我的问题是:你们有并没有经历过这个问题?并没有,我并没有经历过那个问题。您可以做的只是确保在模块中创建了内部资产模式文件。我找不到模式文件。我不知道它为什么不生成它。如果没有生成架构文件,则无法测试迁移本身。您可以尝试的是,删除迁移代码,但在build.gradle中保留room.schemaLocation annotation processor属性&构建项目&检查是否为数据库的第1个版本生成了架构,然后再生成第2个版本。