Android Studio中无法打印SQL查询生成的Exercise列表问题
问题分析与解决方案
你的代码能返回正确SQL行数,但无法生成Exercise列表、Log无输出,核心问题出在以下几个地方:
1. 数据库复制与打开的文件不匹配
copyDatabaseToInternalStorage方法里,你把assets中的数据库复制成了Exercises_<时间戳>.db,但后续检查和打开的却是Exercises.db——这意味着你实际操作的是系统新建的空数据库,而非从assets复制的目标库。
修复代码:
统一文件名,去掉时间戳,修改复制逻辑里的输出路径:
File outputFile = new File(getFilesDir(), DATABASE_NAME); // 直接使用常量DATABASE_NAME
2. 列名大小写/名称不匹配
你的SQL查询用的是Equipment、Difficulty、Goal作为条件列,但代码中获取列索引时用的是小写equipment、difficulty,以及weight_goal(和查询里的Goal不对应)。SQLite在Android的Linux环境下严格区分大小写,这会导致列索引返回-1,触发后续的if条件过滤,最终无法将数据加入列表。
修复代码:
确保列名与数据库实际定义完全一致,比如:
int equipmentColumnIndex = cursor.getColumnIndex("Equipment"); int difficultyColumnIndex = cursor.getColumnIndex("Difficulty"); int weightGoalColumnIndex = cursor.getColumnIndex("Goal");
同时检查Exercise构造函数的参数是否和数据库列一一对应(比如weightGoal参数是否对应Goal列的数据)。
3. 可选优化:确保游标初始位置正确
虽然cursor.moveToNext()能处理空游标,但为避免游标位置异常,可在循环前显式移动到第一条数据:
if (cursor.moveToFirst()) { do { // 读取数据并生成Exercise的逻辑 } while (cursor.moveToNext()); }
验证步骤
- 卸载应用后重新安装(清除旧的空数据库残留)
- 确认列名与数据库表结构完全匹配
- 运行后查看Logcat的
TAG日志,检查是否有Exercise name等输出
内容的提问来源于stack exchange,提问作者Adil Ahmad
相关产品推荐
相关产品推荐

