Android 光标 - moveToNext() 似乎没有走到光标的末尾

Posted

技术标签:

【中文标题】Android 光标 - moveToNext() 似乎没有走到光标的末尾【英文标题】:Android Cursor - moveToNext() doesnt seem to go to end of cursor 【发布时间】:2012-06-07 23:41:56 【问题描述】:

为什么我的 android 光标没有一直走到原来“承诺”的末尾??

我的 cursor.getCount() 与我上次的 cursor.getPosition() 不同。检查我的while循环!这就是我所做的一切!

注意事项: 1.关于查询联系人内容提供者(android api>5) 2.我只显示基本代码

Cursor cursor = mContext.getContentResolver().query(mUri, mProjections, null, null, null);
Logger.d(TAG, "***  cursor.getCount(): "+cursor.getCount());
while (cursor.moveToNext()) 
    Logger.d(TAG, "| position: "+cursor.getPosition());
    processMainCursor(serializer, cursor);

cursor.close();

processMainCursor() 将显示来自光标的数据 + 执行另一个查询:一个 4 个电话、一个 4 个电子邮件、一个 4 个 IM 帐户:

void processMainCursor(XmlSerializer serializer, Cursor main_cursor) 
     writeCursorData(serializer, main_cursor); //writes cursor data, column by column
     writePhoneEntities(serializer, main_cursor);
     writeEmailEntities(serializer, main_cursor);
     writeIMEntities(serializer, main_cursor);

在我的writeXXX 方法中,我都没有关闭我的main_cursor 或移动下一步!!!..必须相信我.. 我只是做一个新查询,打印数据并关闭该光标

所以统计:

cursor.getCount() = 695 (总是) 评论 writePhoneEntities、writeEmailEntities、writeIMEntities:cursor.getCount() = last cursor.getPosition() = 695(太正确了!) 留下一个/两个/所有我的 writeXEntities 显示随机性;示例:将它们全部保留: last cursor.getPosition() 有时会显示 254、257、253 等;只留下电话和 IM:514、510、511 等(如此不同的 RUN -> 不同的 last cursor.getPosition() VALUE

所以意见.. 为什么会这样?和内存有关吗?

更新: 将我的任何 writeXEntities 显示在 logcat 的末尾: 删除死的内容提供者:联系人

更新 2 添加cursor.moveToFirst(); & 像循环一样

do 
    //do whatever you want
 while (cursor.moveToNext()); 

没有完成任务..

所以也许答案就在这个 logcat 条目中:

05-21 23:29:30.209: I/ActivityThread(7085): Removing dead content provider: contacts
05-21 23:29:30.209: I/ActivityThread(7085): Removing dead content provider: com.android.contacts

writeXEntity 的示例已删除

解决方案 ..我没有正确关闭 writeXEntity 的游标(可能在 main while 之后留下相当多的打开游标)

实际上我是这样关闭的

if(phone_cursor!=null && phone_cursor.getCount() > 0)
                   
     //... stuff
     phone_cursor.close();

我应该在 if 之后关闭

if(phone_cursor!=null && phone_cursor.getCount() > 0)
                   
     //... stuff

phone_cursor.close();

我猜要让一个 basilion 光标打开 ..是答案吗?!?

【问题讨论】:

请发布您的一个(或全部)write 功能,您发布的内容应该可以正常工作。 您应该将您的解决方案作为答案发布然后接受它,这样每个人都会知道找到了解决方案(无需打开帖子并阅读它)。 【参考方案1】:

您需要将光标移动到第一行。尝试在while 循环之前添加cur.moveToFirst()

您也可以考虑使用do-while 循环。这将确保您永远不会跳过游标中的第一行:

if (cursor.moveToFirst()) 
    do 
        //do whatever you want
     while (cursor.moveToNext());               

cursor.close();

【讨论】:

按照作者的例子:调用游标,打印语句,使用cursor.moveToNext()。一个新的光标设置为 index: -1 并且moveToNext() 会将索引移动到 0,因此(if 这就是 pulancheck 所做的全部)moveToFirst() 不是必需的,因为moveToNext() 已经移动了第一行的索引。 是的山姆,但为什么代码打印不同的 cursor.getPosition() ..at 不同的运行? (当我的所有/部分 writeXEntity 未注释时会发生这种情况)以及我的最后一个 logCat 消息“删除死的内容提供程序”呢 @pulancheck1988 我在这里的评论是为了回应亚历克斯的回答,鉴于上下文,我非常不同意。我不知道为什么您的索引会发生变化,请参阅我对您要求更多代码的问题的评论。【参考方案2】:

好吧,它们不会是相同的数字,因为 getCount 是项目数,而 position 是位置,(第一个是 0)。所以最终的位置应该总是比计数小一。

如果不是这样,我想我没有正确理解你的问题。

【讨论】:

【参考方案3】:

使用光标如下图:

             if(cursor.getCount() == 0)
                                 
                 //No entry found
              
              else  
                  cursor.moveToFirst();
                  do 
                     //do whatever you want
                      while (cursor.moveToNext());               
            cursor.close();

【讨论】:

我像你说的那样修改了我所有的光标循环内容&结果:第一次运行-最后一个光标位置:257,第二次运行:256 ..所以仍然没有达到我承诺的 695。【参考方案4】:

阅读您已经找到的答案(关闭游标的问题)后,我认为确保关闭它们的最佳方法是使用以下代码:

Cursor c = null;
try 
   c = <your query>;
   if (c.moveToFirst())  // No point in doing more if empty.
      do 
         <process this cursor row>
       while (c.moveToNext());
   

finally 
   if (c != null) c.close(); // Not sure the check needed, maybe if query was really wrong.

【讨论】:

以上是关于Android 光标 - moveToNext() 似乎没有走到光标的末尾的主要内容,如果未能解决你的问题,请参考以下文章

cursor.moveToNext()不执行,直接执行cursor.close

如何在android中获取短信登录

android sqlite禁止重复插入数据

Android 光标错误 - 确保光标已正确初始化

跟踪鼠标光标android

android中如何更改EditText 的光标颜色?