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

pul*_*988 2 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();
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

在我的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()); 
Run Code Online (Sandbox Code Playgroud)

不做这个工作..

所以答案可能就是这个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
Run Code Online (Sandbox Code Playgroud)

删除writeXEntity的示例

解决方案 ..我wasnt从writeXEntity关闭游标corectly(可能留下相当多打开的游标的主要过了一会儿)

实际上我是这样关闭的

if(phone_cursor!=null && phone_cursor.getCount() > 0)
{                   
     //... stuff
     phone_cursor.close();
}
Run Code Online (Sandbox Code Playgroud)

我应该在if之后关闭

if(phone_cursor!=null && phone_cursor.getCount() > 0)
{                   
     //... stuff
}
phone_cursor.close();
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*ood 9

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

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

if (cursor.moveToFirst()) {
    do {
        //do whatever you want
    } while (cursor.moveToNext());               
}
cursor.close();
Run Code Online (Sandbox Code Playgroud)