Android - 关闭数据库后可以使用SQLite Cursor吗?

时间:2011-11-01 21:25:37

标签: java android sqlite cursor

首先,如果我错了,请纠正我,但是如果你关闭了数据库连接,你就不能使用你从中得到的光标,对吗?

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?就像有没有办法将它传递到其他地方并使用它有点像一个对象?或者,在完成光标操作之前,您是否始终保持数据库连接处于打开状态?

3 个答案:

答案 0 :(得分:11)

不,如下面的链接所示,如果关闭数据库,光标将变为无效。

Will cursor be still alive after database is closed?

答案 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()每次都会返回相同的缓存引用,除非您关闭它。因此,如果您不顾一切地关闭该引用,那么使用相同数据库的后台线程将会死亡。