【问题标题】:How can an Android cursor be at a negative position?Android 光标如何处于负位置?
【发布时间】:2014-12-17 16:23:19
【问题描述】:

在学习迭代光标时,我learned 认为我需要先移动到位置“-1”,然后在循环中使用“moveToNext”:

cursor.moveToPosition(-1);
for (int i = 0; cursor.moveToNext(); i++) {
  //do something with the cursor
}

虽然从数学上讲这是有道理的,但我不知道将光标移动到负位置意味着什么。 documentation 只是说它是有效的——似乎没有说明它是如何使用的。

这仅用于使迭代成为可能,还是位置 -1 有其他用例?

【问题讨论】:

  • 这是非常标准的游标:游标从第一行(索引为 0)之前开始。 stackoverflow.com/a/10723771/139010
  • 你不移动到负位置你将它移动到第一个位置cursor.moveToFirst() aka 0
  • @tyczj 如果我移动到第一个位置并且只有一个位置,我永远不会进入循环。
  • @njzk2 我相信@adamdport 指的是my comment on the accepted answer to that question。基本上有两种干净的迭代方式:(a) moveToPosition(-1) 后跟一个 while 循环,(b) moveToFirst 后跟一个 do-while 循环。
  • @VickyChijwani moveToFirst 如果您将其包装在 if 语句中,它确实有效,moveToFirst 返回一个布尔值是有原因的,您不应该忽略它

标签: android android-cursor


【解决方案1】:

游标不应位于负位置,游标数据从位置 0 开始,这就是为什么在使用获取数据之前始终需要将游标移动到第一个位置的原因

if(cursor.moveToFirst()){
    //you have data in the cursor
}

现在只需使用 do/while 循环即可遍历光标

do{
    //process cursor data
}while(cursor.moveToNext);

您对 for 循环所做的操作打破了该约定,如果您将光标移动到第一个位置,然后尝试执行您的 for 循环,光标将在您处理第一个位置之前尝试移动到下一个位置。这就是为什么当光标中有 1 个东西时不进入 for 循环的原因

【讨论】:

  • 如果它“不应该处于负位置”,为什么“moveToPosition”接受-1?
  • 因为不管有无数据都是默认的起始位置
  • 它将接受任何负数,但如果该数为负数,则默认为-1。光标内的代码检查位置是否
  • @DejanRistic 那么我是否按照当时的预期使用它?
  • 好吧,你不想使用 for 循环,while 循环更有意义,因为该方法返回一个布尔值。这样你就不必担心 i.当你创建一个游标时,它应该默认为-1,它在构造函数中为大多数已知的游标子类(接口)。所以它应该已经是-1了。因此,除非光标为空或之前已移动过,否则 moveToNext() 会将其移动到 0 (如果可以)。所以你可以只使用 moveToNext()。如果人们不了解 moveToFirst() 的工作原理,有时它可能更具可读性。如果您想将其移动到第一个位置,它也可能很有用。
【解决方案2】:

游标中的 -1 索引是默认的起始位置和回退位置。如果存在,调用 moveToFirst 将始终移动到位置 0。您要确定是否使用 moveToFirst,处理该条目然后调用 moveToNext。

if(cursor.moveToFirst()){ // moves to 0, process it.
    process(...);
  while(cursor.moveToNext()){ // moves to 1...n, process them.
     process(...);
   }
 }

这只是处理它的一种方法,希望它有所帮助。

祝你好运

【讨论】:

  • 使用这种方法,我不得不重复process(...);。对我来说似乎是一种代码味道。
  • well process 是一种方法,因此无论如何它都会被调用相同的次数。它将被称为 sizeOf(cursor) 次。 moveToNext 实际上只是在内部调用 moveToPosition(mPos + 1),因此如果您知道光标不为空且位于 -1,则可以使用 moveToNext()。
【解决方案3】:

我怀疑默认光标位置被故意设置为 -1 以使我们能够仅使用 while(cursor.moveToNext()) {...} 进行迭代。没有其他原因使光标处于负位置。

只要你之前没有影响过这个光标,你就不需要将位置重置为-1。

【讨论】:

    【解决方案4】:

    -1 是光标的默认位置,您始终需要将光标移动到第一个位置,即第 0 个索引。执行您的活动

    cursor.moveToFirst(); //moves the cursor to the first position
    

    现在迭代

    while(cursor.moveToNext())//when there's a value in cursor.moveToNext
    {
    //your action to be performed
    }
    

    【讨论】:

    • 在您的代码中 cursor.moveToPosition(-1) 和后续 cursor.moveToNext() 相当于语句 cursor.moveToFirst() 直接将光标移动到位置 0
    • 如果我错了,请纠正我,但是这种方法会跳过第一个元素,或者如果只有一个元素,则根本不进入循环。
    猜你喜欢
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2017-03-28
    • 2012-03-29
    相关资源
    最近更新 更多