Android Studio-SQLite光标不返回任何数据

时间:2019-07-09 13:22:50

标签: java android sqlite android-sqlite

我试图在SQLite数据库的“类别”列中返回不同值的名称。光标似乎未返回任何结果。

我正在使用现有的鸟类数据库来构建Android应用程序。目的是允许用户通过该应用程序浏览数据库。我遇到的问题是试图返回数据库中存在的不同种类的鸟类。数据库似乎已成功打开-没有引发SQLite异常-但是在使用查询后,'。moveToNext'方法似乎未返回任何数据。

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");
        }
        x = db.query(true, TABLE_BIRDS, new String[] { COLUMN[0] } , null, null, COLUMN[0], null, null, null );
        if (x.moveToNext()) {
            Log.i(LOG_TAG, x.getString(x.getColumnIndex("category")));
        }
        else {
            Log.i(LOG_TAG, "The cursor is not returning any data");
        }
        //Simple cursor loop
        if (x.moveToNext()){
            String category = new String();
            category = x.getString(x.getColumnIndex(category));
            categories.add(category);
            Log.i("cursor loop", category);
        }
        return categories;

在上面的代码中,日志消息显示:getCategory在查询之前接收到预期的字符串“ category”,但是在查询之后,if / else循环报告“游标未返回任何数据” “。

我期望查询将返回六个字符串,光标循环会将它们添加到ArrayList'categories'中,并将返回此ArrayList。

请提供任何帮助。

2 个答案:

答案 0 :(得分:3)

假设光标不为空,则应 通过while / for循环遍历结果。

例如:while(x.moveToNext()) { //your logic }

调试此类问题时,先安装SQLite数据库浏览器,然后针对您的数据库检查光标查询,看是否有任何数据,总是很有用。

答案 1 :(得分:1)

这是您的方法的简单版本:

public ArrayList<String> getCategory(String[] name) {
    String TABLE_BIRDS = "main";
    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");
    }

    Cursor x = db.query(true, TABLE_BIRDS, new String[]{name[0]}, null, null, null, null, null, null);

    while (x.moveToNext()) {
        String category = x.getString(0);
        categories.add(category);
        Log.i("cursor loop", category);
    }

    if (x.getCount() == 0) {
        Log.i(LOG_TAG, "The cursor is not returning any data");
    }
    x.close();

    return categories;
}

我猜name[0]包含字符串'category',这是您要查询的列。
由于您将true作为方法query()中的第一个参数传递,这意味着您将获得不同的值,因此不需要group by参数。
您不需要变量COLUMN,因为变量name中有所需的内容。
由于光标仅返回1列,因此您也不需要getColumnIndex()
编辑
代替:

Cursor x = db.query(true, TABLE_BIRDS, new String[]{name[0]}, null, null, null, null, null, null);

尝试rawQuery():

Cursor x = db.rawQuery("SELECT DISTINCT " + name[0] + " FROM " + TABLE_BIRDS, null);