java.lang.IllegalStateException:在房间迁移中没有正确处理迁移

时间:2020-12-31 03:47:54

标签: java android sqlite

我在我的数据库中建立关系时出错,我的应用程序已经在生产中,所以我必须:增加我的数据库的版本号并执行相应的迁移(在我的情况下从版本1到版本2)。

2 个表将受到影响:

  1. CalificacionInterna
  • 列“origen”将被消除
  • 将添加列“id_evento_int”
  1. 事件
  • 列“id_calificacion_int_evento”将被删除

enter image description here

这是我的迁移代码:

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        //Evento
        database.execSQL("CREATE TABLE EventoNew (_id INTEGER PRIMARY KEY, categoria INTEGER, nombre TEXT, descripcion TEXT, fecha TEXT, hora TEXT, estatus INTEGER, id_semestre_ev INTEGER, FOREIGN KEY(id_semestre_ev) REFERENCES Semestre(_id) ON DELETE CASCADE)");
        database.execSQL("INSERT INTO EventoNew (_id, categoria, nombre, descripcion, fecha, hora, estatus, id_semestre_ev) SELECT _id, categoria, nombre, descripcion, fecha, hora, estatus, id_semestre_ev FROM Evento");
        database.execSQL("DROP TABLE Evento");
        database.execSQL("ALTER TABLE EventoNew RENAME TO Evento");
        //CalificacionInterna
        database.execSQL("CREATE TABLE CalificacionInternaNew (_id INTEGER PRIMARY KEY, calificacion TEXT, nombre TEXT, fechaAlmacenamiento TEXT, porcentaje TEXT, detalles TEXT, id_subcategoria_cal INTEGER, id_categoria_cal_int INTEGER, id_parcial_int INTEGER, id_asignatura_int INTEGER, id_evento_int INTEGER, FOREIGN KEY(id_subcategoria_cal) REFERENCES Subcategoria(_id) ON DELETE CASCADE, FOREIGN KEY(id_categoria_cal_int) REFERENCES CategoriaCal(_id) ON DELETE CASCADE, FOREIGN KEY(id_parcial_int) REFERENCES Parcial(_id) ON DELETE CASCADE, FOREIGN KEY(id_asignatura_int) REFERENCES Asignatura(_id) ON DELETE CASCADE, FOREIGN KEY(id_evento_int) REFERENCES Evento(_id) ON DELETE CASCADE)");
        database.execSQL("INSERT INTO CalificacionInternaNew (_id, calificacion, nombre, fechaAlmacenamiento, porcentaje, detalles, id_subcategoria_cal, id_categoria_cal_int, id_parcial_int, id_asignatura_int) SELECT _id, calificacion, nombre, fechaAlmacenamiento, porcentaje, detalles, id_subcategoria_cal, id_categoria_cal_int, id_parcial_int, id_asignatura_int FROM CalificacionInterna");
        database.execSQL("DROP TABLE CalificacionInterna");
        database.execSQL("ALTER TABLE CalificacionInternaNew RENAME TO CalificacionInterna");
    }
};

基本上

  • 我创建了一个包含必要列的新表
  • 复制必要的信息
  • 删除之前的表并重命名新表

不幸的是,我收到以下错误:

    E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.calificaciones, PID: 4819
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.calificaciones/com.calificaciones.MainActivity}: java.lang.IllegalStateException: Migration didn't properly handle: CalificacionInterna(com.calificaciones.entity.Calificacion).
     Expected:
    TableInfo{name='CalificacionInterna', columns={calificacion=Column{name='calificacion', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_subcategoria_cal=Column{name='id_subcategoria_cal', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, fechaAlmacenamiento=Column{name='fechaAlmacenamiento', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_asignatura_int=Column{name='id_asignatura_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, detalles=Column{name='detalles', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, _id=Column{name='_id', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1, defaultValue='null'}, porcentaje=Column{name='porcentaje', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_categoria_cal_int=Column{name='id_categoria_cal_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_parcial_int=Column{name='id_parcial_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, nombre=Column{name='nombre', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_evento_int=Column{name='id_evento_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[ForeignKey{referenceTable='Subcategoria', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_subcategoria_cal], referenceColumnNames=[_id]}, ForeignKey{referenceTable='Parcial', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_parcial_int], referenceColumnNames=[_id]}, ForeignKey{referenceTable='Evento', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_evento_int], referenceColumnNames=[_id]}, ForeignKey{referenceTable='CategoriaCal', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_categoria_cal_int], referenceColumnNames=[_id]}, ForeignKey{referenceTable='Asignatura', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_asignatura_int], referenceColumnNames=[_id]}], indices=[Index{name='index_CalificacionInterna__id', unique=false, columns=[_id]}]}
     Found:
E/AndroidRuntime: TableInfo{name='CalificacionInterna', columns={calificacion=Column{name='calificacion', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_subcategoria_cal=Column{name='id_subcategoria_cal', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, fechaAlmacenamiento=Column{name='fechaAlmacenamiento', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_asignatura_int=Column{name='id_asignatura_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, detalles=Column{name='detalles', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, _id=Column{name='_id', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1, defaultValue='null'}, porcentaje=Column{name='porcentaje', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_categoria_cal_int=Column{name='id_categoria_cal_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_parcial_int=Column{name='id_parcial_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, nombre=Column{name='nombre', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_evento_int=Column{name='id_evento_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[ForeignKey{referenceTable='Subcategoria', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_subcategoria_cal], referenceColumnNames=[_id]}, ForeignKey{referenceTable='Evento', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_evento_int], referenceColumnNames=[_id]}, ForeignKey{referenceTable='Asignatura', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_asignatura_int], referenceColumnNames=[_id]}, ForeignKey{referenceTable='Parcial', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_parcial_int], referenceColumnNames=[_id]}, ForeignKey{referenceTable='CategoriaCal', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_categoria_cal_int], referenceColumnNames=[_id]}], indices=[]}
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2789)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2872)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1595)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6543)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:440)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:810)
     Caused by: java.lang.IllegalStateException: Migration didn't properly handle: CalificacionInterna(com.calificaciones.entity.Calificacion).
     Expected:
    TableInfo{name='CalificacionInterna', columns={calificacion=Column{name='calificacion', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_subcategoria_cal=Column{name='id_subcategoria_cal', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, fechaAlmacenamiento=Column{name='fechaAlmacenamiento', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_asignatura_int=Column{name='id_asignatura_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, detalles=Column{name='detalles', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, _id=Column{name='_id', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1, defaultValue='null'}, porcentaje=Column{name='porcentaje', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_categoria_cal_int=Column{name='id_categoria_cal_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_parcial_int=Column{name='id_parcial_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, nombre=Column{name='nombre', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_evento_int=Column{name='id_evento_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[ForeignKey{referenceTable='Subcategoria', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_subcategoria_cal], referenceColumnNames=[_id]}, ForeignKey{referenceTable='Parcial', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_parcial_int], referenceColumnNames=[_id]}, ForeignKey{referenceTable='Evento', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_evento_int], referenceColumnNames=[_id]}, ForeignKey{referenceTable='CategoriaCal', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_categoria_cal_int], referenceColumnNames=[_id]}, ForeignKey{referenceTable='Asignatura', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_asignatura_int], referenceColumnNames=[_id]}], indices=[Index{name='index_CalificacionInterna__id', unique=false, columns=[_id]}]}
     Found:
E/AndroidRuntime: TableInfo{name='CalificacionInterna', columns={calificacion=Column{name='calificacion', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_subcategoria_cal=Column{name='id_subcategoria_cal', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, fechaAlmacenamiento=Column{name='fechaAlmacenamiento', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_asignatura_int=Column{name='id_asignatura_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, detalles=Column{name='detalles', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, _id=Column{name='_id', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1, defaultValue='null'}, porcentaje=Column{name='porcentaje', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_categoria_cal_int=Column{name='id_categoria_cal_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_parcial_int=Column{name='id_parcial_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, nombre=Column{name='nombre', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id_evento_int=Column{name='id_evento_int', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[ForeignKey{referenceTable='Subcategoria', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_subcategoria_cal], referenceColumnNames=[_id]}, ForeignKey{referenceTable='Evento', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_evento_int], referenceColumnNames=[_id]}, ForeignKey{referenceTable='Asignatura', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_asignatura_int], referenceColumnNames=[_id]}, ForeignKey{referenceTable='Parcial', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_parcial_int], referenceColumnNames=[_id]}, ForeignKey{referenceTable='CategoriaCal', onDelete='CASCADE', onUpdate='NO ACTION', columnNames=[id_categoria_cal_int], referenceColumnNames=[_id]}], indices=[]}
        at androidx.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:103)
        at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade(FrameworkSQLiteOpenHelper.java:177)
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:338)
        at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:238)
        at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase(FrameworkSQLiteOpenHelper.java:145)
        at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.java:106)
        at androidx.room.RoomDatabase.inTransaction(RoomDatabase.java:476)
        at androidx.room.RoomDatabase.assertNotSuspendingTransaction(RoomDatabase.java:281)
        at com.calificaciones.crud.SemestreDao_Impl.numeroDeSemestres(SemestreDao_Impl.java:360)
        at com.calificaciones.MainActivity.reparar(MainActivity.java:156)
        at com.calificaciones.MainActivity.onCreate(MainActivity.java:93)
        at android.app.Activity.performCreate(Activity.java:7009)
        at android.app.Activity.performCreate(Activity.java:7000)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2742)
            ... 9 more

一切似乎都匹配,但是尽管外键的顺序与我的@Entity 类中的顺序相同,但它们在我看来的顺序却与从 “预期”” 的顺序不同找到”

“预期:” 子类别、Parcial、Evento、CategoriaCal、Asignatura

“找到:” Subcategoria、Evento、Asignatura、Parcial、CategoriaCal

不知道是不是有问题,另一个区别是“预期:” indices=[Index{name='index_CalificacionInterna__id', unique=false, columns=[_id]}] “发现:” indices=[]< /p>

我希望有人能指导我问题是什么以及如何解决

1 个答案:

答案 0 :(得分:0)

问题我解决了,先试试把这个:

database.execSQL("CREATE INDEX IF NOT EXISTS index_EventoNew__id ON EventoNew(_id)"); 创建表后,但我收到一个错误,说索引已经存在,后来我在 this answer 中读到应该在重命名表后放置它,这解决了我的问题:< /p>

database.execSQL("CREATE INDEX IF NOT EXISTS index_Evento__id ON Evento(_id)");

相关问题