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

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

Solutions Collecting From Web of "Можно ли использовать SQLite Cursor после закрытия базы данных?"

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

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

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

Верный.

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

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

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

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

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

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

Я использовал 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(); } } 

In onDestroy () … openHelper.close ();

В противном случае вы не сможете использовать android SimpleCursorAdapter или что-то в этом роде. Разумеется, в этом вопросе очень не хватает документов andriod. Но, помните, getWriteableDatabase () всегда возвращает одну и ту же кешированную ссылку каждый раз, если вы ее не закрыли. Итак, если вы закрываете эту ссылку волей-неволей, фоновые потоки и то, что нет, которые используют одну и ту же базу данных, умрут.