【问题标题】:SQLite returning an empty cursor even if the data exist即使数据存在,SQLite 也会返回空游标
【发布时间】:2015-04-29 21:47:36
【问题描述】:

我在我的 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;
}

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

【问题讨论】:

  • 您需要发布代码以获得此方面的帮助。
  • 删除catch 以获取错误消息。
  • 也不例外,我得到的是一个空光标。
  • 我看不懂你的代码!为什么你得到相同的光标“大小”次?

标签: android sqlite cursor


【解决方案1】:

问题已解决。

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

【讨论】:

    【解决方案2】:

    查询后,如果游标包含多于零行,则节:

    {
    // existing data
    }
    

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

    {
     // new data
    }
    

    将被执行“大小”次。

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

    此外:

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

    相当于:

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

    行的if条件:

    else if(c.getcount()>0)
    

    可以省略。

    【讨论】:

    • 感谢您的回复。我没有执行相同的查询大小时间,而是 x 值仅供参考,我应该改用“i”。考虑在每个循环中使用不同参数的相同查询。
    • 也许,当您查询 i==1 时,没有找到结果。
    猜你喜欢
    • 1970-01-01
    • 2019-04-20
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多