Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Studio-SQLite游标不返回任何数据_Java_Android_Sqlite_Android Sqlite - Fatal编程技术网

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

Java Android Studio-SQLite游标不返回任何数据,java,android,sqlite,android-sqlite,Java,Android,Sqlite,Android Sqlite,我试图在SQLite数据库的“category”列中返回不同值的名称。光标似乎没有返回任何结果 我正在使用预先存在的鸟类数据库构建一个Android应用程序。其目的是允许用户通过应用程序浏览数据库。我遇到的问题是试图返回数据库中存在的不同种类的鸟类。数据库似乎已成功打开-未引发SQLite异常,-但使用查询后,“.moveToNext”方法似乎未返回任何数据 public ArrayList<String> getCategory(String[] name){ St

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

我正在使用预先存在的鸟类数据库构建一个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;
public ArrayList getCategory(字符串[]名称){
字符串表_=“main”;
字符串[]列=名称;
ArrayListcategories=新的ArrayList();
如果(名称[0]!=null)
{
Log.d(Log_标记,名称[0]);
}否则{
Log.d(Log_标记,“名称[0]尚未传递”);
}
x=db.query(true,TABLE_,新字符串[]{COLUMN[0]},null,null,COLUMN[0],null,null,null);
if(x.moveToNext()){
Log.i(Log_标记,x.getString(x.getColumnIndex(“category”));
}
否则{
Log.i(Log_标记,“光标未返回任何数据”);
}
//简单光标循环
if(x.moveToNext()){
字符串类别=新字符串();
category=x.getString(x.getColumnIndex(category));
类别。添加(类别);
Log.i(“光标循环”,类别);
}
退货类别;
在上面的代码中,日志消息显示:getCategory在查询之前收到预期的字符串“category”,但在查询之后,if/else循环报告“游标未返回任何数据”

我所期望的是,查询将返回六个字符串,游标循环将它们添加到ArrayList“categories”中,并且将返回此ArrayList


如果您有任何帮助,我们将不胜感激。

假设光标不为空,您应该 使用while/for循环迭代结果

e、 g:
while(x.moveToNext()){
//你的逻辑
}


在调试此类问题时,安装SQLite DB browser总是很有用的,然后检查游标对DB的查询,查看是否有任何数据。

假设游标不是空的,您应该
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;
使用while/for循环迭代结果

e、 g:
while(x.moveToNext()){
//你的逻辑
}


调试此类问题时,安装SQLite DB browser总是很有用的,然后检查光标对DB的查询,查看是否有任何数据。

下面是一个简单的方法:

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;
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;
}
请尝试rawQuery():


以下是您的方法的更简单版本:

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;
}
请尝试rawQuery():


x、 moveToFirst();然后while(x.moveToNext())将跳过第1行。光标似乎返回null。我在查询后的if/else测试中尝试了x.moveToFirst,并得到了相同的结果。@grainman如果光标为null,null指针异常将使您的应用程序崩溃。好的,我不知道!您能为我提供一些方法来访问它返回的内容吗?您检查了cu吗rsor直接(在sqlite浏览器中)对DB的查询?查看其中是否有数据?x.moveToFirst();然后while(x.moveToNext())将跳过第1行。光标似乎返回null。我在查询后的if/else测试中尝试了x.moveToFirst,并得到了相同的结果。@grainman如果光标为null,null指针异常将使您的应用程序崩溃。好的,我不知道!您能为我提供一些方法来访问它返回的内容吗?您检查了cu吗rsor直接(在sqlite浏览器中)对DB的查询?若要查看其中是否有任何数据,请尝试rawQuery()。是否确定名称[0]包含字符串类别,并且这是列的名称?是否尝试了rawQuery()?query()性能更好,rawQuery()对于这样的简单情况更简单。在我发布的方法中尝试它,而不是在你的方法中。最后一件事是尝试,这样你就可以看到sql语句的原样。将此行放在执行rawQuery()的行之前:
Log.d(Log_标记,“SELECT DISTINCT”+name[0]+“FROM”+TABLE_);
语句正常。这意味着由于光标不为null,表为空。设备中的数据库与使用SQLite浏览器检查的数据库不同。请尝试rawQuery()。是否确定名称[0]包含字符串类别,这是列的名称?是否尝试rawQuery()?query()对于性能而言,rawQuery()更为简单,对于这样的简单情况,它更为简单。请使用我发布的方法而不是您的方法进行尝试。最后一件事是,您可以看到sql语句的原样。请将此行放在执行rawQuery()的行之前:
Log.d(Log_标记,“SELECT DISTINCT”+name[0]+“FROM”+TABLE))
语句没有问题。这意味着由于光标不为null,因此表为空。设备中的数据库与使用SQLite浏览器检查的数据库不同。