【问题标题】:Trying to requery an already closed cursor试图重新查询一个已经关闭的游标
【发布时间】:2013-04-18 01:08:41
【问题描述】:
我正在做简单的查询,例如:
Cursor c = databaseHelper.getReadableDatabase().rawQuery("select " + MyTable.TABLE_FIELD.getColumnName() + " from " + MyTable.TABLE_NAME, null);
然后我提取所需的数据并填充一些视图。
c.close();
一切都按预期进行。我有一个共享意图,要发送一封包含显示的一些信息的电子邮件。 java.lang.IllegalStateException 在电子邮件应用程序发送电子邮件或关闭并且我的活动恢复“生命”后抛出。
此异常仅在这种情况下引发,如果我将其发送到后台然后再次调用它,则不会引发此异常。我什至打算打开 youtube 并播放视频,但没有抛出此异常...
我真的不知道为什么会这样。
感谢您的宝贵时间。
ps:我试过//c.close();,但也没用。
【问题讨论】:
标签:
android
sqlite
cursor
illegalstateexception
【解决方案1】:
您可以使用 c.requery(),但它在 API 级别 11 中已被弃用。
不要使用这个。只需请求一个新的光标,这样你就可以做到这一点
异步并在新光标出现后更新您的列表视图
返回。
再次执行创建游标的查询,刷新它的
内容。这可以在任何时候完成,包括在调用
停用()。由于此方法可以对数据库执行查询
并且可能需要一段时间,如果调用它可能会导致 ANR
主 (UI) 线程。如果正在使用此方法,则会打印警告
在主线程上执行。
【解决方案2】:
我找到了导致此问题的原因。电子邮件的一些信息是由“utils”类中的另一个光标提供的。在向电子邮件提供信息后,此光标已关闭,这导致了问题。而不是c.close();,我改为c = null;,现在它可以工作了。
可能不是最好的解决方案,但现在它正在工作。
谢谢。
【解决方案3】:
这对我有用..
public void onBackPressed() {
Intent i = new Intent(getApplicationContext(), ClassName.class);
startActivity(i);
finish();
super.onStop();
}