获取Cursor内容异常:仅读取到Cursor中两个值之一的问题求助
解决Cursor仅读取单个数据项的问题
嘿,我之前也碰到过类似的Cursor遍历问题,大概率是循环逻辑或者数据提取的细节没处理到位。结合你给出的代码片段,我来帮你梳理下可能的问题点和解决办法:
最常见的问题:循环条件缺失
从你的代码片段看,你用了do-while循环,但很可能漏掉了while(cursor.moveToNext())这个关键条件——没有这个的话,循环只会执行一次,自然只能拿到第一条数据。
修正后的完整代码示例
这里给你写一个规范的实现,你可以对照着调整:
public List<Countries> getAllCountries() { List<Countries> countryList = new ArrayList<>(); // 查询语句 String selectQuery = "SELECT * FROM " + BDD.TABLE_COUNTRIES; // 查询操作建议用getReadableDatabase,比getWritableDatabase更安全 SQLiteDatabase db = dataBase.getReadableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); // 遍历所有行数据 if (cursor.moveToFirst()) { do { Countries c = new Countries(); // 推荐用getColumnIndexOrThrow获取列索引,避免硬编码索引出错 c.setId(cursor.getInt(cursor.getColumnIndexOrThrow(BDD.COLUMN_ID))); c.setCountryName(cursor.getString(cursor.getColumnIndexOrThrow(BDD.COLUMN_NAME))); // 如果还有其他字段,按照同样的方式提取 countryList.add(c); } while (cursor.moveToNext()); // 必须加上这个,让Cursor移动到下一行 } // 务必关闭Cursor和数据库,避免资源泄漏 cursor.close(); db.close(); return countryList; }
其他可能导致问题的细节
- 硬编码列索引:比如直接写
cursor.getInt(0),如果表结构调整,列的顺序变了,就会取错数据,甚至拿到空值。用getColumnIndex或getColumnIndexOrThrow能避免这个问题。 - 表/列名拼写错误:如果
BDD.TABLE_COUNTRIES或列名写错了,查询结果可能只有一行(甚至空),看起来像是Cursor只读取了一个值。 - 数据库本身数据不足:可以直接用SQLite工具执行你的
SELECT * FROM ...语句,确认数据库里确实有多条数据。 - 资源未关闭:虽然不会直接导致只读取一个数据,但长期不关闭Cursor和数据库会造成内存泄漏,一定要养成关闭的习惯。
调试小技巧
如果还是有问题,可以在循环里加日志打印,看看Cursor的位置和提取的数据:
Log.d("CountryDebug", "当前行位置:" + cursor.getPosition() + ",提取的国家:" + c.getCountryName());
这样能快速判断是循环没执行多次,还是数据提取出错了。
内容的提问来源于stack exchange,提问作者Louis Djankou
相关产品推荐
相关产品推荐

