Android - Можно ли использовать SQLite Cursor после закрытия базы данных? - PullRequest
15 голосов
/ 02 ноября 2011

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

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

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

Ответы [ 3 ]

11 голосов
/ 02 ноября 2011

Нет, как сказано в ссылке ниже, если вы закроете базу данных, курсор станет недействительным.

Будет ли курсор еще жив после закрытия базы данных?

3 голосов
/ 02 ноября 2011

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

Correct.

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

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

Например, есть ли способ передать его в другое место и использовать как объект

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

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

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

0 голосов
/ 11 ноября 2011

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

Однако, кажется, что предполагаемое использование открытой структуры помощника, это открыть БД при запуске действия и закрыть его, когда действие уничтожено.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...