即使数据存在,SQLite也会返回一个空光标

时间:2013-05-13 06:11:48

标签: android sqlite cursor

我在我的Android应用程序中使用sqlite来存储数据。 每次启动应用程序时,我都会从服务器获取一些数据并将其存储在客户端中。现有数据更新和新数据插入到数据库中。

但是在很多情况下,当我通过查询从DB访问现有项目时,我从DB获得一个空白光标 "select * from Table where itemId = x"。好像我在更新之前从设备/模拟器中提取数据库,我可以看到数据库中存在数据。

只有从服务器获取大量数据并与现有数据进行比较时才会出现此问题。 比较是在循环中完成的,每次我得到一个光标并关闭它,然后再转到下一个比较。

try{
int[] ids = getIds(); // get required ids
for(i =0; i<ids.length, i++)
{
// 
Cursor c = db.rawQuery("Select * from Table where id = "+ids[i]);
if(c == null || (c != null && c.getcount() == 0))
{
 // new data
}else if(c.getcount()>0)
{
// existing data
}
}
}catch(Exception e){
    e.printStackTrace();
}finally{
if(c!=null && !c.isClosed())
{
c.close()
}
c = null;
}

我注意到,第一次我得到一个带有数据的光标,但之后我得到了空白光标。

2 个答案:

答案 0 :(得分:1)

在查询之后,如果光标包含多于零的行,则为:

{
// existing data
}

将执行“大小”次。 如果游标为null或不包含任何行,则表示您的部分:

{
 // new data
}

将执行“大小”次。

这是因为您的查询是静态的。对于循环中的每次迭代,您正在进行相同的查询。 如果这是你想要的,你应该在循环之外调用rawQuery方法。

此外:

if(c == null || c != null && c.getcount() == 0)

相当于:

if(c == null || c.getCount() == 0)

行中的if条件:

else if(c.getcount()>0)

可以省略。

答案 1 :(得分:0)

问题已解决。

很抱歉这个问题与查询无关,但输入参数(id)。在某些情况下,id错误,因此返回空白光标。