You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中SQLite Cursor无数据返回问题求助

我来帮你排查下这个问题,你的代码里有几个明显的问题导致游标没返回预期数据:

问题分析

  1. 重复调用moveToNext()导致数据丢失
    你在查询后先调用了一次x.moveToNext()判断是否有数据,这时候游标已经移动到第一条记录的位置了。之后又调用了一次x.moveToNext(),直接跳过了第一条记录;如果数据库里的记录不多,甚至会直接跳到游标末尾,导致后续取不到任何数据。

  2. getColumnIndex参数错误
    循环里你写了x.getColumnIndex(category),但这里的category是你刚声明的空字符串String category = new String();,这会导致找不到目标列,要么抛出异常,要么返回-1,自然取不到有效数据。你应该使用实际的列名(比如COLUMN[0]或者直接写"category")。

  3. 循环逻辑无法遍历所有数据
    你用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:58:38