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条件中又重复调用了一次该方法,没有实际作用。
修复步骤
- 生成可读的行字符串,有两种可选实现方式
- 给
Message类重写toString()方法,自定义需要展示的字段,示例:@Override public String toString() { return "id=" + id + ", 消息类型=" + type + ", 消息内容='" + send + "'"; } - 直接在循环中拼接行内容字符串,不需要依赖Message类的实现,灵活度更高。
- 给
- 修正遍历逻辑,确保读取所有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
相关产品推荐
相关产品推荐

