15

首先,如果我错了,请纠正我,但是如果您关闭数据库连接,则无法使用从中获得的光标,对吗?

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));

那么关闭数据库后有什么办法可以使用光标吗?有没有办法将它传递到其他地方并像一个对象一样使用它?或者您是否总是必须让数据库连接保持打开状态,直到您完成游标?

4

3 回答 3

11

不,正如下面链接中所说,如果您关闭数据库,则光标将变为无效。

关闭数据库后游标是否仍然存在?

于 2011-11-01T21:42:48.527 回答
3

首先,如果我错了,请纠正我,但是如果您关闭数据库连接,则无法使用从中获得的光标,对吗?

正确的。

那么关闭数据库后有什么办法可以使用光标吗?

我不这么认为。当我完成游标时,我总是关闭数据库,即使我将游标传递给另一个游标对象。

有没有办法将它传递到其他地方并像一个对象一样使用它?

创建将return cursorobject;在需要的地方使用该方法的方法。(还可以创建完成后关闭数据库的方法)

或者您是否总是必须让数据库连接保持打开状态,直到您完成游标?

否则光标会搞砸。

于 2011-11-01T21:45:18.650 回答
0

我使用cursor.moveToLast()了,它允许我在数据库关闭后使用游标进行迭代。我不知道这是否是故意的。

但是,似乎 open helper 框架的预期用途是在活动启动时打开数据库,并在活动被销毁时关闭它。

在 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 文档在这方面非常缺乏。但是,请记住,getWriteableDatabase() 每次总是返回相同的缓存引用,除非您关闭它。因此,如果您不顾一切地关闭该引用,后台线程以及其他使用相同数据库的线程,将会死掉。

于 2011-11-11T05:08:48.633 回答