我在我的数据库中建立关系时出错,我的应用程序已经在生产中,所以我必须:增加我的数据库的版本号并执行相应的迁移(在我的情况下从版本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 类中的顺序相同,但它们在我看来的顺序却与从 “预期” 到 ” 的顺序不同找到”
“预期:” 子类别、Parcial、Evento、CategoriaCal、Asignatura
“找到:” Subcategoria、Evento、Asignatura、Parcial、CategoriaCal
不知道是不是有问题,另一个区别是“预期:” indices=[Index{name='index_CalificacionInterna__id', unique=false, columns=[_id]}]
“发现:” indices=[]
< /p>
我希望有人能指导我问题是什么以及如何解决
答案 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)");