Room数据库迁移异常:TableInfo列不匹配问题排查求助
Room数据库迁移崩溃:BROADCAST_LIST表未正确处理
我的Android应用因Room数据库迁移问题崩溃,崩溃日志显示迁移未正确处理BROADCAST_LIST表,相关日志片段如下:
java.lang.IllegalStateException: Migration didn't properly handle: BROADCAST_LIST(com.enjayworld.enjaycrm.broadcastAutomation.data.model.PhoneNumber). Expected: TableInfo{name='BROADCAST_LIST', columns={date=Column{name='date', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='CURRENT_TIMESTAMP'}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='undefined'}, verification_status=Column{name='verification_status', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}, phone=Column{name='phone', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}, isWhatsApp=Column{name='isWhatsApp', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}, file_name=Column{name='file_name', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='undefined'}}, foreignKeys=[], indices=[]} Found: TableInfo{name='BROADCAST_LIST', columns={}, foreignKeys=[], indices=[]} at androidx.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.kt:93) at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade(FrameworkSQLiteOpenHelper.kt:253) at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:416) at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:316) at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableOrReadableDatabase(FrameworkSQLiteOpenHelper.kt:232) at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.innerGetDatabase(FrameworkSQLiteOpenHelper.kt:190) at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getSupportDatabase(FrameworkSQLiteOpenHelper.kt:151) at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase(FrameworkSQLiteOpenHelper.kt:104) at androidx.room.RoomDatabase.inTransaction(RoomDatabase.kt:632) at androidx.room.RoomDatabase.assertNotSuspendingTransaction(RoomDatabase.kt:451)
问题分析与解决建议
根本原因
日志明确显示:Room预期BROADCAST_LIST表包含6个带约束的字段,但迁移完成后检测到该表无任何字段(columns={})。核心原因是迁移逻辑中出现了表结构丢失的情况,比如误删表、创建/修改表的SQL执行失败,或者事务回滚导致表结构未正确更新。
排查步骤
- 检查对应版本的
Migration实现,确认是否存在DROP TABLE BROADCAST_LIST的误操作,或者创建/修改表的SQL存在语法错误(如字段名拼写错误、缺少约束关键字)。 - 提取Migration中的SQL语句,在SQLite工具中基于旧版本数据库结构执行,验证是否能生成符合预期的表结构。
- 检查Migration代码是否存在未捕获的异常,异常会导致事务回滚,进而使表结构变更失效。
修复方案
恢复表结构
如果是误删表或表创建失败,在Migration中重新创建符合要求的表,SQL示例:CREATE TABLE IF NOT EXISTS BROADCAST_LIST ( id INTEGER PRIMARY KEY NOT NULL, phone TEXT NOT NULL, verification_status TEXT NOT NULL, isWhatsApp INTEGER NOT NULL, file_name TEXT NOT NULL, date TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP );若需要保留原有数据,需先备份数据再重建表,或调整SQL逻辑。
修正SQL语法错误
核对Migration中的SQL语句,确保每个字段的类型、NOT NULL约束、默认值(如date字段的CURRENT_TIMESTAMP)与Room预期的表结构完全一致。测试迁移流程
使用Room的MigrationTestHelper编写单元测试,模拟从旧版本数据库到新版本的迁移过程,提前发现并修复迁移逻辑中的问题。
内容的提问来源于stack exchange,提问作者Suraj Pal
相关产品推荐
相关产品推荐

