如何在循环外部获取循环内创建的数据?Java代码返回首行问题排查
解决循环中仅返回第一行数据的问题
嘿,我来帮你排查这个问题!你这段代码只返回第一行数据,其实是两个小问题共同导致的,咱们一步步来分析和解决:
问题根源
str列表的创建位置错误
你把List<String> str = new ArrayList<>();写在了while循环的外面,这意味着整个循环过程中只会有这一个str列表。第一次循环时,你往里面添加了第一行的4列数据;第二次循环时,你又继续往这个列表里追加新的4列数据——这时候str里已经有8个元素了,但你还是用str.get(0)到str.get(3)来取数据,这些值始终是第一行的内容,所以最终arr里的所有Dicionario对象,其实都是用第一行数据创建的。忘记移动游标
循环中没有调用cursor.moveToNext(),游标会一直停留在初始的第一行位置,即使循环执行多次,每次取的都是同一行的数据。
修复方案
把str列表的创建移到while循环内部,同时在循环末尾添加cursor.moveToNext()来移动游标到下一行。修改后的代码如下:
public ArrayList<Dicionario> retornaArray() { controlaBanco = new controlaBanco(this); // 数据库操作类实例 ArrayList<Dicionario> arr = new ArrayList<>(); // 存储格式化后的数据 Cursor cursor = controlaBanco.carregaDados(); // 获取数据库游标 int count = 0; // 先判断游标是否有效,避免空指针 if (cursor != null && cursor.moveToFirst()) { while (!cursor.isAfterLast() && count <= 1000) { // 每次循环都创建新的str列表,存储当前行的4列数据 List<String> str = new ArrayList<>(); str.add(cursor.getString(0)); str.add(cursor.getString(1)); str.add(cursor.getString(2)); str.add(cursor.getString(3)); Dicionario dicionario = new Dicionario(str.get(0), str.get(1), str.get(2), str.get(3)); arr.add(dicionario); count++; cursor.moveToNext(); // 移动游标到下一行 } // 关闭游标,避免资源泄漏 cursor.close(); } return arr; }
额外优化建议
- 省略中间列表
str:其实你完全可以直接用游标获取的值创建Dicionario,减少不必要的中间步骤,提升效率:Dicionario dicionario = new Dicionario( cursor.getString(0), cursor.getString(1), cursor.getString(2), cursor.getString(3) ); - 自动管理游标资源:可以用
try-with-resources语法,让系统自动关闭游标,避免忘记关闭导致的资源泄漏:public ArrayList<Dicionario> retornaArray() { controlaBanco = new controlaBanco(this); ArrayList<Dicionario> arr = new ArrayList<>(); int count = 0; try (Cursor cursor = controlaBanco.carregaDados()) { if (cursor != null && cursor.moveToFirst()) { while (!cursor.isAfterLast() && count <= 1000) { Dicionario dicionario = new Dicionario( cursor.getString(0), cursor.getString(1), cursor.getString(2), cursor.getString(3) ); arr.add(dicionario); count++; cursor.moveToNext(); } } } // 游标会在这里自动关闭 return arr; }
内容的提问来源于stack exchange,提问作者faker faked fakes
相关产品推荐
相关产品推荐

