SQLite Inner Join查询无返回结果?问题排查及修复方案
解决SQLite Inner Join查询无结果的问题
我之前也遇到过类似的情况:关联两张表做Inner Join时明明有匹配数据却返回空Cursor,结合你的代码和修复记录,总结出两个核心问题和对应的解决方法:
1. URI路由错误导致未执行Join查询
在MainActivity里,最初你用了普通的Workout列表URI来触发关联查询,但你的Provider里只有匹配JOIN_TABLE_URI才会执行Join语句,所以根本没走到正确的查询分支。
- 错误代码:
Uri uri = withAppendedId(WorkoutContract.WorkoutEntry.CONTENT_URI, id); - 修复为:
Uri uri = withAppendedId(WorkoutContract.WorkoutEntry.JOIN_TABLE_URI, id);
2. 查询语句硬编码参数,无法动态匹配目标Workout ID
原Join查询里把WHERE条件写死成了workouts._id=1,而且没有传入实际点击的Workout ID作为参数,导致查询的是固定ID的数据,自然找不到你想要的结果。
- 错误的查询代码:
final String QUERY = "SELECT workouts._id, " + "exercise_name," + "weight," + "reps," + "rpe"+ " FROM " + "exercises"+ " INNER JOIN workouts ON workouts._id = exercises.workout_id"+ " WHERE workouts._id=1"; cursor = db.rawQuery(QUERY, null); - 修复后的动态查询:
final String QUERY = "SELECT workouts._id, exercise_name, weight, reps, rpe " + "FROM exercises " + "INNER JOIN workouts ON workouts._id = exercises.workout_id " + "WHERE workouts._id=?"; selectionArgs = new String[]{String.valueOf(ContentUris.parseId(uri))}; cursor = db.rawQuery(QUERY, selectionArgs);
这两个修复完成后,你的Cursor应该就能正确返回对应Workout的所有训练项目了,你可以通过cursor.getCount()打印行数来验证结果。
内容的提问来源于stack exchange,提问作者Omar Carino
相关产品推荐
相关产品推荐

