迁移未正确处理房间数据库(java.lang.IllegalStateException)



我有致命异常:java.lang.RuntimeException:计算数据库实时数据时出现异常。在事故报告中

为什么这里的所有东西都是空的TableInfo

预期:

TableInfo{name='card_data',columns={bPathImg=Column{name='PathImg',type='TEXT',affinity='2',notNull=false,primaryKeyPosition=0,defaultValue='ull'},cardName=列{name='cardName',type='TEXT',affinity='2',notNull=false,primaryKeyPosition=0,defaultValue='ull'},cardId=列{name='cardId',type='NTEGER',affinity='3',notNull=true,primaryKeyPosition=1,defaultValue='ull'},cardType=列{name='cardType',type='TEXT',affinity='2',notNull=false,primaryKeyPosition=0,defaultValue='ull'},time=Column{name='time',type='TEXT',affinity='2',notNull=false,primaryKeyPosition=0,defaultValue='ull'},fPathImg=列{name='PathImg',type='TEXT',affinity='2',notNull=false,primaryKeyPosition=0,defaultValue='ull'},sqlDate=列{name='sqlDate',type='TEXT',affinity='2',notNull=false,primaryKeyPosition=0,defaultValue='ull'},cardNumber=列{name='cardNumber',type='NTEGER',affinity='3',notNull=true,primaryKeyPosition=0,defaultValue=‘ull’}},foreignKeys=[],indexs=[]}

找到:

TableInfo{name='card_data',columns={},foreignKeys=[],indexes=[]}

这是我的实体类

@Entity(tableName = "card_data")
@Keep
public class CardDataEntity {
@PrimaryKey(autoGenerate = true)
private int cardId;
private String cardName;
private String time;
private String sqlDate;
private int cardNumber;
private String fPathImg;
private String bPathImg;
private String cardType;
@Ignore
private boolean isHeader;
public CardDataEntity(String cardName, String time, String sqlDate, int cardNumber, String fPathImg, String bPathImg, String cardType) {
this.cardName = cardName;
this.time = time;
this.sqlDate = sqlDate;
this.cardNumber = cardNumber;
this.fPathImg = fPathImg;
this.bPathImg = bPathImg;
this.cardType = cardType;
this.isHeader = false;
}
// setter getter here
}

这是我的数据库类

@Database(entities = {ScanDataEntity.class , ScanDataBookmarkEntity.class,
GenerateDataEntity.class, GenerateBookmarkDataEntity.class, CardDataEntity.class, CardBookmarkDataEntity.class},
version = 7, exportSchema = false)
public abstract class ScanDatabase extends RoomDatabase {
public abstract ScanDataDao scanDataDao();
// DAO classes
private static ScanDatabase dataBase;
public static ScanDatabase getInstance(Context context){
if (null== dataBase){
dataBase= buildDatabaseInstance(context);
}
return dataBase;
}
private static final Migration MIGRATION_6_7 = new Migration(6, 7) {
@Override
public void migrate(SupportSQLiteDatabase database) {
try {
database.execSQL("ALTER TABLE generate_data "
+ " ADD COLUMN generateImgPath TEXT");
}catch (Exception e){
e.printStackTrace();
}
}
};

// same migration for other versions 
private static ScanDatabase buildDatabaseInstance(Context context) {
return Room.databaseBuilder(context,
ScanDatabase.class,
"scan_database")
.addMigrations(MIGRATION_6_7,MIGRATION_5_7,MIGRATION_4_7,MIGRATION_3_7,MIGRATION_2_7,MIGRATION_1_7)
//                .fallbackToDestructiveMigration()
.allowMainThreadQueries().build();
}
}

有人能帮帮我吗?我真的不知道我做错了什么,也不知道这是不是一个bug。

使用@ColumnInfo注释指定列名,以提供与此字段关联的列数据。像

@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "cardId")
private int cardId;
.....

最后出现了相同的错误。对于最终也来到这里的未来读者:

在我的案例中,我在自己生成的Schema文件中有一个简单的拼写错误:

架构8.json

"tableName": "measurement",
"createSql": "CREATE TABLE measurement...

迁移8到12:

database.execSQL("ALTER TABLE measurement RENAME TO measurements;")

架构12.json:

"tableName": "measurement",
"createSql": "CREATE TABLE measurements ...
  • 错误的原因是:tableName应该是measurmentS而不是measurement

希望这也能帮助其他人,因为错误本身并没有真正帮助我识别这个拼写错误

相关内容

最新更新