当前位置: 首页 > 知识库问答 >
问题:

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

孔才
2023-03-14

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

为什么TableInfo中的所有内容都是空的

@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。

共有1个答案

沈博涉
2023-03-14

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

@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "cardId")
private int cardId;
.....
 类似资料:
  • 预期: 找到TableInfo{name='user',Columns={name=Column{name='name',Type='text',NotNull=False,PrimaryKeyPosition=0},Age=Column{name='Age',Type='integer',NotNull=True,PrimaryKeyPosition=0},ID=Column{name='id'

  • java.lang.IllegalStateException:迁移未正确处理data_table 应为:TableInfo{name=“data_table”,columns=url=column{name=“url”,type=“text”,notnull=false,primarykeyposition=0}..... 找到:TableInfo{name='data_table',colum

  • 我有一个由Ormlite实现的现有数据库。我正在尝试用Ormlite生成的现有sqlite文件迁移到Room。 当我们在ormlite中为表列使用long数据类型时,它在SQLite中被转换为BIGINT。因此,创建的模式包含BIGINT类型的列,而BIGINT类型对于Room是未知的。当我尝试用Room升级应用程序时,我遇到了迁移异常。 java.lang.IllegalStateExcepti

  • 然而,我发现手动操作很不方便。有没有办法告诉Room:我不会接触任何现有的表,所以数据是安全的。请为我创建迁移?

  • 问题内容: 我正在使用Java开发数据库迁移工具。该工具将数据库表及其数据复制到目标数据库。但是我希望它可以在不同的数据库上工作。从mysql复制并在derby等中创建。使用JDBC,我们可以收集有关表及其列的足够信息。但是我要问的是,是否可以使用sql free在Java上重新创建表。我的意思是不同的数据库具有不同的数据类型,有时它们在sql语法上也有所不同。那么JDBC或任何其他库(可以是开放

  • 在开发和维护一个数据库驱动的应用程序时, 数据库的结构会像代码一样不断演变。 例如,在开发应用程序的过程中,会增加一张新表且必须得加进来; 在应用程序被部署到生产环境后,需要建立一个索引来提高查询的性能等等。 因为一个数据库结构发生改变的时候源代码也经常会需要做出改变, Yii 提供了一个 数据库迁移 功能,该功能可以记录数据库的变化, 以便使数据库和源代码一起受版本控制。 如下的步骤向我们展示了