You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

健身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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:32:23