3

为什么我的 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

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

更新:将我的任何 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 光标..是答案吗?!?

4

4 回答 4

9

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

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

if (cursor.moveToFirst()) {
    do {
        //do whatever you want
    } while (cursor.moveToNext());               
}
cursor.close();
于 2012-06-03T17:02:50.537 回答
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.
}
于 2013-07-30T09:58:46.007 回答
0

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

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

于 2012-06-03T17:04:54.637 回答
0

使用光标如下图:

             if(cursor.getCount() == 0)
              {                   
                 //No entry found
              }
              else  {
                  cursor.moveToFirst();
                  do {
                     //do whatever you want
                     } while (cursor.moveToNext());               
            cursor.close();
于 2012-06-03T17:09:02.630 回答