Android SQLiteException(code1)排查:应用崩溃问题求助
排查Android SQLite应用中“no such column: favourites”崩溃问题
嘿,这个错误我太熟悉了——本质就是你的SQLite表结构和代码里的查询/操作不匹配,咱们一步步拆解问题:
1. 先核对数据库表的创建语句
打开你的DBAdapter类,找到创建表的CREATE TABLE SQL语句,仔细检查:
- 有没有明确定义
favourites列?比如是不是漏写了,或者拼写错误(比如写成美式的favorite少了末尾的s)? - 列的定义语法有没有问题?比如是不是漏了逗号,或者类型写错?
举个正确的示例,如果是布尔型收藏标记,创建语句应该类似:
CREATE TABLE your_table_name ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, favourites INTEGER DEFAULT 0 -- 这里要明确存在这个列 );
2. 检查数据库升级逻辑
如果是你后来才给表加的favourites列,那模拟器里的旧数据库文件还保留着原来的表结构,新的列不会自动生效:
- 最简单的临时解决方法:卸载模拟器里的应用,再重新安装,这样会生成全新的数据库文件。
- 长期正确的做法:在
DBAdapter的onUpgrade方法里添加列升级逻辑,比如:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 2) { // 假设新增列是版本2的变更 db.execSQL("ALTER TABLE your_table_name ADD COLUMN favourites INTEGER DEFAULT 0;"); } }
注意要对应修改数据库的版本号(比如把DATABASE_VERSION从1改成2),这样应用启动时会触发升级逻辑。
3. 排查代码中的查询/操作语句
检查MainScreen和DBAdapter里所有用到favourites的地方:
- 比如SELECT语句里有没有把
favourites列加入查询字段? - WHERE子句里有没有用到
favourites = ?这类条件? - 有没有拼写错误?比如把
favourites写成favourite或者其他变体?
举个错误示例:如果你的查询是db.query(TABLE_NAME, new String[]{"id", "title", "favourites"}, null, null, null, null, null);,但表实际没有这个列,就会直接抛出SQLiteException。
4. 直接验证数据库实际结构
用Android Studio的Device File Explorer找到模拟器里的数据库文件:
路径一般是data/data/[你的应用包名]/databases/[你的数据库名].db
把这个文件下载到本地,用SQLite可视化工具(比如SQLiteStudio)打开,直接查看表的列结构——这是最直观的验证方式,能立刻确认favourites列是否真的存在。
5. 确认数据库初始化流程
检查DBAdapter的实例是否正确初始化,有没有在使用数据库前调用getWritableDatabase()或getReadableDatabase()——这两个方法会触发数据库的创建或升级逻辑,如果没调用,表可能根本没被创建(不过这种情况一般会报表不存在,不是列不存在,但也值得排查)。
按照这几步走,大概率能找到问题所在——大部分情况都是旧数据库没更新,或者创建语句漏写了列。
内容的提问来源于stack exchange,提问作者Mwu La Flaga
相关产品推荐
相关产品推荐

