Android Studio查询SQLite第二张表提示database disk image is malformed问题
问题原因及解决方案
该报错通常由旧版数据库缓存、表写入逻辑异常两类原因导致,你可以按以下步骤排查解决:
- 优先清除旧数据库缓存
你当前数据库版本号固定为1,SQLiteOpenHelper的onCreate方法仅会在应用首次安装、数据库文件不存在时执行。如果之前安装过仅包含course_info表的旧版应用,后续新增note_info表后没有升级数据库版本,系统会直接复用旧的残缺数据库文件,就会出现第一张表可查、第二张表查询触发损坏报错的情况。
操作方法:直接卸载测试设备/模拟器上的对应应用,或者进入应用设置清除全部存储数据,重新运行安装即可。这一方法可以解决90%以上的该类场景问题。 - 检查数据写入逻辑
确认DatabaseDataWorker类的insertSampleNotes方法是否符合表约束要求:note_info表的COLUMN_NOTE_TITLE、COLUMN_COURSE_ID字段设置了NOT NULL约束,如果插入时这两个字段传入了空值,或者插入过程中事务异常中断未正确提交,都会破坏数据库文件结构。 - 补充数据库升级逻辑
如果后续需要迭代表结构,不要直接修改现有版本的建表语句,而是提升DATABASE_VERSION数值,同时在onUpgrade方法中补充适配逻辑,示例如下:public static final int DATABASE_VERSION = 2; // 版本号+1 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(oldVersion < 2){ // 删除旧表后重新执行创建逻辑 db.execSQL("DROP TABLE IF EXISTS " + NoteKeeperDatabaseContract.CourseInfoEntry.TABLE_NAME); db.execSQL("DROP TABLE IF EXISTS " + NoteKeeperDatabaseContract.NoteInfoEntry.TABLE_NAME); onCreate(db); } } - 手动验证数据库文件
可以通过Android Studio的Device File Explorer,导出路径为/data/data/[你的应用包名]/databases/NoteKeeper.db的数据库文件,用本地SQLite客户端打开,直接检查表结构是否完整、note_info表的数据是否正常写入。
内容的提问来源于stack exchange,提问作者Kingsley Onwus
相关产品推荐
相关产品推荐

