Android Studio点击ListView时数据库访问异常:SQLite表不存在错误
我之前开发时也碰到过完全一样的情况——在Navicat里明明建好表了,App一运行就报这个错,给你几个实用的排查和解决步骤:
确认App使用的数据库和你Navicat操作的是同一个
Android的SQLite数据库默认存在设备/模拟器的内部存储(路径:data/data/你的包名/databases/),很多时候我们用Navicat修改的是导出的副本,或者本地assets里的旧文件,App实际运行时加载的还是没有bcc表的原始数据库。
解决办法:要么卸载App重新安装(如果你的SQLiteOpenHelper的onCreate方法里有创建bcc表的逻辑),要么通过Android Studio的Device File Explorer导出当前App使用的数据库文件,用Navicat打开确认是否真的存在bcc表。检查
SQLiteOpenHelper的表创建逻辑
你在Navicat手动建表没用,App启动时是靠SQLiteOpenHelper的onCreate方法来初始化数据库的。如果这个方法里没有写创建bcc表的SQL语句,那App创建的数据库自然没有这个表。
比如你的DBHelper里应该有类似这样的代码:@Override public void onCreate(SQLiteDatabase db) { // 确保这里包含bcc表的创建语句 String createBccTable = "CREATE TABLE bcc (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, ...)"; db.execSQL(createBccTable); }如果之前已经安装过App,
onCreate不会再次执行,这时候你需要把数据库版本号(SQLiteOpenHelper构造方法的第四个参数)调高,让onUpgrade方法触发,在里面补充创建表的逻辑,或者执行ALTER TABLE语句。如果是从assets拷贝数据库的情况
如果你是把预建好的数据库放在assets目录,App启动时拷贝到内部存储,那要检查两个点:- assets里的数据库文件确实包含bcc表;
- 拷贝逻辑是否正确覆盖了旧文件——很多时候代码里会判断数据库是否已存在,存在就不拷贝,导致修改后的新文件没替换上去。
用Database Inspector实时验证
Android Studio自带的Database Inspector可以直接连接正在运行的App的数据库,实时查看表结构和数据,不用导出文件,能快速确认bcc表是否存在,这是我现在排查这类问题最常用的工具。
内容的提问来源于stack exchange,提问作者AngelCause

