Можно ли использовать 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));

Итак, есть ли способ использовать Курсор после закрытия базы данных? Как есть способ передать его в другом месте и использовать его как объект? Или вы всегда должны оставлять соединение с базой данных открытым до тех пор, пока не закончите курсор?

Ответы

Ответ 2

Прежде всего, исправьте меня, если я ошибаюсь, но если вы закроете базу данных соединение, вы не можете использовать курсор, который вы получили от него, правильно?

Правильно.

Итак, есть ли способ использовать Курсор после закрытия базы данных?

Я так не думаю. Я всегда закрывал базу данных, когда закончил курсор, даже если передать курсор другому объекту курсора.

Как и любой другой способ передать его в другом месте и использовать его как объект?

Создайте метод, который будет return cursorobject;, и используйте метод, где вам это нужно. (Также создайте метод, который закроет db после того, как вы закончите)

Или вы всегда должны оставлять соединение с базой данных открытым до тех пор, пока вы не выполняются с помощью курсора?

В противном случае курсор закроется.

Ответ 3

Я использовал cursor.moveToLast(), и это позволило мне использовать курсор для итерации после закрытия базы данных. Я не знаю, было ли это намеренно.

Однако, похоже, что предполагаемое использование открытой вспомогательной структуры - это открытие db при запуске активности и закрытие его при уничтожении Activity.

В AsyncTask изнутри onCreate()...

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() всегда возвращает одну и ту же кешированную ссылку каждый раз, если вы ее не закрыли. Итак, если вы закрываете эту ссылку волей-неволей, фоновые потоки и то, что нет, которые используют одну и ту же базу данных, умрут.