簡體   English   中英

java.lang.IllegalStateException:遷移在房間遷移中沒有正確處理

[英]java.lang.IllegalStateException: Migration didn't properly handle in Room Migration

我在我的數據庫中建立關系時犯了一個錯誤,我的應用程序已經在生產中,所以我必須:增加我的數據庫的版本號並執行相應的遷移(在我的例子中是從版本 1 到版本 2)。

2個表將受到影響:

  1. 國際校准
  • 列“origin”將被刪除
  • 將添加列“id_evento_int”
  1. 甚至
  • “id_calificacion_int_evento”列將被刪除

在此處輸入圖像描述

這是我的遷移代碼:

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 class 中的順序相同,但在我看來,它們的順序從“預期”“找到”不同

“預期:”子類別、Parcial、Evento、CategoriaCal、Asignatura

“發現:”子類別、Evento、Asignatura、Parcial、CategoriaCal

我不知道問題是否存在,另一個區別是“Expected:” indices=[Index{name='index_CalificacionInterna__id', unique=false, columns=[_id]}] “Found:” indices=[]

我希望有人能指導我解決問題是什么以及如何解決

我解決了這個問題,首先嘗試把這個:

database.execSQL("CREATE INDEX IF NOT EXISTS index_EventoNew__id ON EventoNew(_id)"); 創建表后,我收到一條錯誤消息,指出索引已經存在,后來我在這個答案中讀到它應該在重命名表后放置,這解決了我的問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM