首先,如果我错了,请纠正我,但是如果你关闭了数据库连接,你就不能使用你从中得到的光标,对吗?
db.open();
Cursor c = db.query(true, "MyTable", columns, null, null, null, null, null, null);
db.close();
// The Cursor is empty now because the db was closed...
c.moveToNext();
Log.v(TAG, c.toString(0));
关闭数据库后,有没有办法使用Cursor?就像有没有办法将它传递到其他地方并使用它有点像一个对象?或者,在完成光标操作之前,您是否始终保持数据库连接处于打开状态?
答案 0 :(得分:11)
不,如下面的链接所示,如果关闭数据库,光标将变为无效。
答案 1 :(得分:3)
首先,如果我错了,请纠正我,但如果你关闭数据库 连接,你不能使用你从它得到的光标,对吗?
正确。
关闭数据库后,有没有办法使用Cursor?
我不这么认为。当我完成Cursor时,我总是关闭数据库,即使我将光标传递给另一个Cursor对象。
就像有没有办法将它传递到其他地方并使用它有点像 对象
创建return cursorobject;
的方法并在任何需要的地方使用该方法。 (还有创建完成后将关闭db的方法)
或者你总是要打开数据库连接,直到你 是用光标完成的吗?
否则光标会搞砸。
答案 2 :(得分:0)
我使用cursor.moveToLast()
,它允许我在数据库关闭后使用游标进行迭代。我不知道这是否是故意的。
但是,似乎打开帮助程序框架的预期用途是在活动开始时打开db,并在Activity被销毁时关闭它。
在onCreate()中的AsyncTask ...
new StartupTask().execute();
下面的AsyncTask Thread.sleep()只是为了给出足够的时间来显示对话框,以便你可以看到它的工作原理。当你完成比赛时显然要把它拿掉。 ;)
private class StartupTask extends AsyncTask
{
private ProgressDialog progressDialog;
@Override
protected Object doInBackground(final Object... objects)
{
openHelperRef.getWritableDatabase();
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return null;
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
runOnUiThread(new Runnable()
{
public void run()
{
progressDialog = ProgressDialog.show(
MyActivity.this, "Title",
"Opening/Upgrading the database, please wait", true);
}
});
}
@Override
protected void onPostExecute(Object object)
{
super.onPostExecute(object);
progressDialog.dismiss();
}
}
在onDestroy()中openHelper.close();
否则,您将无法使用android SimpleCursorAdapter或类似的东西。当然,andriod docs在这方面非常缺乏。但是,请记住,getWriteableDatabase()每次都会返回相同的缓存引用,除非您关闭它。因此,如果您不顾一切地关闭该引用,那么使用相同数据库的后台线程将会死亡。