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

时间:2012-06-03 16:53:49

标签: android android-contacts android-cursor

为什么我的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 - >不同的最后一个cursor.getPosition()VALUE

所以oppinions ..为什么?与记忆有关吗?

更新: 留下任何我的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示例 REMOVED

解决方案 ..我从coreXEntity核心关闭游标(可能在主要时间后留下相当多的打开游标)

实际上我正在这样关闭

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

如果

我应该关闭
if(phone_cursor!=null && phone_cursor.getCount() > 0)
{                   
     //... stuff
}
phone_cursor.close();

我想让一个basilion光标打开..答案是什么?!?

4 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:0)

嗯,它们的数量不一样,因为getCount是项目数,而位置是位置,(第一个是0)。所以最终的位置应该总是比计数少一个。

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

答案 2 :(得分:0)

使用光标如下所示:

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

答案 3 :(得分:0)

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

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.
}