Android Studio中SQLite Cursor无数据返回问题求助
我来帮你排查下这个问题,你的代码里有几个明显的问题导致游标没返回预期数据:
问题分析
重复调用
moveToNext()导致数据丢失
你在查询后先调用了一次x.moveToNext()判断是否有数据,这时候游标已经移动到第一条记录的位置了。之后又调用了一次x.moveToNext(),直接跳过了第一条记录;如果数据库里的记录不多,甚至会直接跳到游标末尾,导致后续取不到任何数据。getColumnIndex参数错误
循环里你写了x.getColumnIndex(category),但这里的category是你刚声明的空字符串String category = new String();,这会导致找不到目标列,要么抛出异常,要么返回-1,自然取不到有效数据。你应该使用实际的列名(比如COLUMN[0]或者直接写"category")。循环逻辑无法遍历所有数据
你用if (x.moveToNext())只会执行一次,无法遍历游标里的所有记录,必须用while循环持续移动游标直到没有更多数据。
修复后的代码
public ArrayList<String> getCategory(String[] name){ String TABLE_BIRDS = "main"; String[] COLUMN = name; ArrayList<String> categories = new ArrayList<>(); if (name[0] != null) { Log.d(LOG_TAG, name[0]); } else { Log.d(LOG_TAG, "name[0] has not been passed"); } // 执行DISTINCT查询,获取唯一的category值 Cursor x = db.query(true, TABLE_BIRDS, new String[] { COLUMN[0] }, null, null, COLUMN[0], null, null, null ); // 先判断游标是否有效,再移动到第一条记录 if (x != null && x.moveToFirst()) { do { // 通过传入的列名获取对应字段值 String category = x.getString(x.getColumnIndex(COLUMN[0])); categories.add(category); Log.i("cursor loop", category); } while (x.moveToNext()); // 循环遍历所有记录 } else { Log.i(LOG_TAG, "The cursor is not returning any data"); } // 关闭游标,避免内存泄漏(Android SQLite操作最佳实践) if (x != null) { x.close(); } return categories; }
额外注意事项
- 确认你的
main表中确实存在category列,且该列有非空的实际数据,不然即使查询逻辑正确也不会返回结果。 - 后续操作数据库时,记得始终关闭游标和数据库连接,避免内存泄漏问题。
内容的提问来源于stack exchange,提问作者grainman
相关产品推荐
相关产品推荐

