You need to enable JavaScript to run this app. Android输出Cursor信息至Logcat时ROW VALUES显示对象哈希值的问题
优惠活动
大模型
产品
解决方案
定价
更多

Android输出Cursor信息至Logcat时ROW VALUES显示对象哈希值的问题

问题原因
  • 直接触发原因:Message类未重写toString()方法。Java的字符串拼接、TextUtils.join这类字符串合并操作,会自动调用对象的toString()方法完成类型转换;Java所有类的根父类Object的默认toString实现就是输出类全路径@十六进制内存哈希值,因此你看到的com.example.androidlabs.Message@55b3428本质就是这个默认实现的输出,和Cursor本身没有关系。
  • 隐藏的逻辑缺陷:现有Cursor遍历代码只读取了结果集的第一行。代码仅在进入判断时调用一次moveToFirst()读取第一行数据,没有通过moveToNext()循环遍历剩余行,哪怕修复了toString的问题,也只会输出1条结果,和Logcat显示的“总结果数3”不匹配。
  • 冗余代码:在if判断之前单独写了一行c.moveToFirst(),后续if条件中又重复调用了一次该方法,没有实际作用。
修复步骤
  1. 生成可读的行字符串,有两种可选实现方式
    • 给Message类重写toString()方法,自定义需要展示的字段,示例:
      @Override
      public String toString() {
          return "id=" + id + ", 消息类型=" + type + ", 消息内容='" + send + "'";
      }
      
    • 直接在循环中拼接行内容字符串,不需要依赖Message类的实现,灵活度更高。
  2. 修正遍历逻辑,确保读取所有Cursor行,修正后的核心片段:
    List<String> cursorRowValuesList = new ArrayList<>();
    // 增加非空判断,避免Cursor为空时触发空指针
    if (c != null && c.moveToFirst()) {
        // 提前获取列索引,减少循环内的重复查询开销
        int sendColIndex = c.getColumnIndex(MyOpener.COL_TEXT);
        int typeColIndex = c.getColumnIndex(MyOpener.MESSAGE_TYPE);
        int idColIndex = c.getColumnIndex(MyOpener.COL_ID);
        // 循环判断是否读到Cursor末尾
        while (!c.isAfterLast()) {
            long id = c.getLong(idColIndex);
            int type = c.getInt(typeColIndex);
            String content = c.getString(sendColIndex);
            // 拼接当前行的可读文本
            String rowText = "id:" + id + " | type:" + type + " | 内容:" + content;
            cursorRowValuesList.add(rowText);
            // 指针移动到下一行
            c.moveToNext();
        }
    }
    // 用换行符分隔每行结果,Logcat中阅读更清晰
    String cursorRowValues = TextUtils.join("\n", cursorRowValuesList);
    

内容的提问来源于stack exchange,提问作者DrVonSamuel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 08:54:02