求助:无法显示SQLite表内容,仅输出对象地址
解决SQLite查询结果显示对象地址而非数值的问题
嘿,我来帮你搞定这个问题!你看到的“对象地址”其实是Java默认的对象字符串表现形式,核心问题出在实体类没有重写toString()方法,另外你的代码里还有个类职责混淆的小问题,咱们一步步理顺:
第一步:纠正类职责混淆(关键前提)
你的databaseHandler应该是继承自SQLiteOpenHelper的数据库操作助手类,用来处理数据库创建、增删改查逻辑,但你现在把它当成了存储联系人数据的实体类来用,这会让代码逻辑混乱。
先创建一个专门的联系人实体类,比如Contact:
public class Contact { private int id; private String name; // 如果有手机号字段,也可以加上 // private String phoneNumber; // 空参构造 public Contact() {} // 带参构造 public Contact(int id, String name) { this.id = id; this.name = name; } // Getter和Setter方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } // 重点:重写toString()方法,自定义对象的字符串表现 @Override public String toString() { return "联系人{" + "ID=" + id + ", 姓名='" + name + '\'' + // 如果有手机号,加上", 手机号='" + phoneNumber + '\'' + '}'; } }
第二步:修正getAllContacts()方法
把原来方法里的databaseHandler替换成咱们刚创建的Contact实体类,同时优化数据库操作的细节:
public List<Contact> getAllContacts() { List<Contact> contactList = new ArrayList<>(); // 查询语句 String selectQuery = "SELECT * FROM " + TABLE_NAME; // 查询用getReadableDatabase更高效,不需要写入权限 SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); // 遍历游标封装数据 if (cursor.moveToFirst()) { do { Contact contact = new Contact(); // 直接用getInt获取数字类型,不用转字符串再转Integer contact.setId(cursor.getInt(0)); contact.setName(cursor.getString(1)); // 如果有手机号字段,加上contact.setPhoneNumber(cursor.getString(2)); contactList.add(contact); } while (cursor.moveToNext()); } // 记得关闭游标和数据库,避免内存泄漏 cursor.close(); db.close(); return contactList; }
为什么这样能解决问题?
当你打印contactList里的对象时,Java默认会调用Object类的toString()方法,它的输出格式就是类名@哈希码(也就是你看到的“对象地址”)。咱们重写Contact类的toString()方法后,就会按照自定义的格式输出实体的字段值,比如联系人{ID=1, 姓名='张三'},这样就能看到你想要的数值内容了。
内容的提问来源于stack exchange,提问作者robin
相关产品推荐
相关产品推荐

