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