健身App SQLite数据库列异常及数据读取失败问题求助
解决健身App SQLite查询返回"Not set"的问题
看起来你已经搞定了分表时的列不存在问题,但现在卡在了查询数据始终返回"Not set"的情况——这说明你的DisplayData方法执行查询后,没有找到匹配Username的记录。我们一步步来排查和解决:
1. 先确认传入的Username参数是否正确
这是最常见的诱因:你调用DisplayData时传入的Username和数据库中存储的用户名不完全一致,比如大小写差异、多了空格,或者Username变量本身是空值/null。
- 先在
setData方法里加个临时提示,看看当前传入的用户名是什么:public void setData() { db = new dbHelper(this); // 临时添加:检查Username的值 Toast.makeText(this, "当前查询的用户名:" + Username, Toast.LENGTH_SHORT).show(); try { userWeight.setText(db.DisplayData(Username, dbHelper.COL_4)); // ... 其他设置代码 } catch (Exception e) { Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); } } - 如果发现
Username是空的,那要检查这个变量是在哪里赋值的——比如是不是从SharedPreferences或者登录页面传过来时出了问题。
2. 直接在数据库里验证查询结果
打开SQLite数据库浏览器,找到你的App数据库文件(路径一般是data/data/你的应用包名/databases/),手动执行查询语句:
SELECT * FROM 你的表名 WHERE Username = '你刚才看到的用户名';
- 如果这条查询没有返回任何结果,说明数据库里根本没有对应的数据——那你要检查注册时的插入逻辑是不是正确把数据存进数据库了。
- 还要确认你的
TABLE_NAME常量和数据库里实际的表名完全一致(SQLite默认大小写不敏感,但严格匹配能避免很多坑)。
3. 给DisplayData方法加调试日志
现在的方法没有任何调试信息,很难知道问题出在哪。修改方法,添加日志输出,帮你定位问题:
public String DisplayData(String username,String column) { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = null; try { // 打印查询参数 Log.d("DB_DEBUG", "查询用户名:" + username + ",目标列:" + column); cursor = db.rawQuery("SELECT * FROM "+ TABLE_NAME +" WHERE Username =?",new String[]{username}); // 打印返回的行数 Log.d("DB_DEBUG", "查询到的记录数:" + cursor.getCount()); if(cursor.moveToFirst()){ String result = cursor.getString(cursor.getColumnIndexOrThrow(column)); Log.d("DB_DEBUG", "查询结果:" + result); return result; }else{ Log.d("DB_DEBUG", "未找到匹配的记录"); return "Not set"; } } finally { // 一定要关闭Cursor,避免内存泄漏 if (cursor != null) { cursor.close(); } } }
然后打开Android Studio的Logcat,过滤DB_DEBUG标签,就能清楚看到:
- 你传入的用户名是否正确
- 查询到底返回了多少条记录
- 如果有记录,结果值是什么
4. 检查数据库版本与表结构
你之前从两张表合并成一张表,有没有更新dbHelper里的数据库版本号?如果版本号没改,App会继续使用旧的数据库文件,导致表结构不对或者数据没迁移。
- 打开你的
dbHelper类,找到super(context, DATABASE_NAME, null, DATABASE_VERSION);这一行,把DATABASE_VERSION的值加1(比如从1改成2)。 - 或者直接卸载App重新安装,清除旧的数据库文件,确保使用最新的表结构。
额外建议:优化数据库操作的健壮性
- 你已经在用参数化查询(
?占位符),这点很好,能避免SQL注入问题。 - 一定要记得关闭
Cursor,我上面的修改已经加了finally块来处理,避免内存泄漏。
内容的提问来源于stack exchange,提问作者CJay Mcleod
相关产品推荐
相关产品推荐

