我试图在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。
请提供任何帮助。
答案 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);