为什么我的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
或移动下一个!!! ..我必须相信我...我只是做一个新的查询,打印数据&关闭光标
所以统计数据:
所以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光标打开..答案是什么?!?
答案 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.
}