SQLIte查询返回空游标

3

我正在尝试使用以下查询从我的Android SQLite数据库中获取数据。

Cursor cursor = db.rawQuery("SELECT * FROM Task where taskId = 1 ", null);

然而,尽管光标为空,仍存在值为1的taskId。
如果我这样做:
Cursor cursor = db.rawQuery("SELECT * FROM Task", null);

我的光标包含所有值,包括一个taskId的值为1。

我已经尝试了以下所有命令,但都没有成功:

Cursor cursor = db.rawQuery("SELECT * FROM Task where taskId = " + 1, null);
Cursor cursor = db.rawQuery("SELECT * FROM Task where taskId = " + "'1'", null);
Cursor cursor = db.rawQuery("SELECT * FROM Task where taskId = ?", new String[]{"1"});

taskId是一个整型(Integer)的变量,试过使用文本(Text)类型代替,但同样不起作用。

有什么我没有考虑到的吗?非常感谢帮助!

编辑: 创建数据库的代码如下:

CREATE TABLE Task + " (" +
        _id INTEGER PRIMARY KEY," +
        "taskDescription TEXT, +                
        "taskId INTEGER," +
        "taskName TEXT" + 
        "PreviousTaskID " + "REFERENCES " + "PreviousTasks " + 
        "(" + PreviousTasks._ID + "))"

展示一下代码怎么样? - Phantômaxx
你能展示一下你的表格定义吗? - Merlevede
哎呀,还是没有错...你确定你没有混淆_id字段和taskId吗? - Merlevede
我尝试使用_id和taskId两种方式,但结果相同 :( - deimos1988
4个回答

9
Cursor cursor = null;
String Query ="SELECT * FROM Task where taskId = 1 ";
cursor = sqldb.rawQuery(Query, null);

if (cursor != null && cursor.moveToFirst()) {
  do {
    // ...
  } while (cursor.moveToNext());

  cursor.close();
}

i hope its useful to you..


1
如果您创建了一个具有4个字段的数据库,并使用了此数据库,那么如果您添加了新字段,则需要在手机上重新创建数据库,删除并创建它。
您的数据库必须位于/data/data/com.yourapp.package/databases/,使用thisthis打开它并检查是否有任何问题。
删除所有空格:
Cursor cursor = getReadableDatabase().rawQuery("SELECT  * FROM  Task WHERE taskId=1", null);

将光标移到第一个结果:
cursor.moveToFirst();

使用 getInt
int taskid = c.getnt(c.getColumnIndex("taskId"));

1
我刚刚发现问题所在:当访问光标时,我使用了以下代码:
cursor.moveToFirst();
while(cursor.moveToNext()){
  //stuff
};

相反,我必须做的是这样的:

cursor.moveToFirst();
do{
  //stuff
} while(cursor.moveToNext());

我查询时没有注意到错误。
Cursor.rawQuery("SELECT * FROM TASK");

因为我的光标有多个条目。但当我查询时

Cursor.rawQuery("SELECT * FROM TASK WHERE taskID=1");

光标只有一个条目,因为 while 循环而被跳过了。

1
请注意,如果没有数据,这将失败。您还应该检查moveToFirst()的返回值。 - laalto

0

如果你的意思是通过“空”来告诉光标中元素的计数为-1,那么你只需要在之前使用moveToFirst()方法就可以了。

Cusror c = rawQuery(...); 
// this line is required 
c.moveToFirst();

然后,如果您尝试调用

c.getCount()

如果查询返回的结果大于0,则返回!= 0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接