【问题标题】:Cursor isAfterLast() returns true when reaching last row游标 isAfterLast() 到达最后一行时返回 true
【发布时间】:2016-05-03 04:54:08
【问题描述】:

我想在具有 2 行数据的表上迭代游标。我的第一次尝试是:

c.moveToFirst();
while(!c.isAfterLast()){
//this code runs once
c.moveToNext();
}

但是在调试后我注意到我丢失了最后一行数据。这是因为当 mPos 变量等于计数器中的 mCount 时,while 循环结束。用下面的代码替换上面的代码后,问题就解决了:

c.moveToFirst();
do{
//this code runs twice
}while(c.moveToNext())

基本上在第一种方法中,while 循环的运行时间比第二种方法少 1 次。 isAfterLast 不是应该只有在光标经过最后一行后才返回 true 吗?

【问题讨论】:

  • 你确定在第一个代码块中,c.moveToNext() 是 while 循环内的最后一行代码吗?两者都应该做同样的事情。
  • 如果在只有一行数据的游标上运行第一个代码块会发生什么?它会导致循环体根本不执行吗?这是否意味着 c.isAfterLast() 在调用 c.moveToFirst() 后立即返回 true?
  • 那么,如果你在 empty 光标上运行第一个块会发生什么?它会抛出异常吗?
  • @DanielNugent 是的,我确定它在结尾
  • @jason44107 非常好。我明天早上会测试并更新问题的详细信息

标签: java android sql cursor


【解决方案1】:

请注意,moveToNext() 返回一个 boolean,表示存在下一个 (true),但同样,如果为真 - 它会移动光标。因此,在这种情况下,当您在 c.moveToNext(); 之后返回评估 while(!c.isAfterLast()) 时,您已经位于最后一项(因此光标指向最后一行之后的位置。

如果您的目标是遍历光标,那么您可以这样做:

while (c.moveToNext()) {
  //do whatever with your data - like 
  //String value = c.getString(c.getColumnIndex("SOME_COLUMN_NAME"));
}

可以看相关讨论here

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多