为什么我的 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 光标..是答案吗?!?