![](/img/trans.png)
[英]Room Database Migration: java.lang.IllegalStateException: Migration didn't properly handle <table_name>
[英]java.lang.IllegalStateException: Migration didn't properly handle in Room Migration
我在我的數據庫中建立關系時犯了一個錯誤,我的應用程序已經在生產中,所以我必須:增加我的數據庫的版本號並執行相應的遷移(在我的例子中是從版本 1 到版本 2)。
2個表將受到影響:
這是我的遷移代碼:
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.