Ответ 1
Нет. Как сказано в приведенной ниже ссылке, если вы закрываете базу данных, курсор становится недействительным.
Будет ли курсор оставаться в живых после закрытия базы данных?
Прежде всего, исправьте меня, если я ошибаюсь, но если вы закрываете соединение с базой данных, вы не можете использовать курсор, который вы получили от него, правильно?
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));
Итак, есть ли способ использовать Курсор после закрытия базы данных? Как есть способ передать его в другом месте и использовать его как объект? Или вы всегда должны оставлять соединение с базой данных открытым до тех пор, пока не закончите курсор?
Нет. Как сказано в приведенной ниже ссылке, если вы закрываете базу данных, курсор становится недействительным.
Будет ли курсор оставаться в живых после закрытия базы данных?
Прежде всего, исправьте меня, если я ошибаюсь, но если вы закроете базу данных соединение, вы не можете использовать курсор, который вы получили от него, правильно?
Правильно.
Итак, есть ли способ использовать Курсор после закрытия базы данных?
Я так не думаю. Я всегда закрывал базу данных, когда закончил курсор, даже если передать курсор другому объекту курсора.
Как и любой другой способ передать его в другом месте и использовать его как объект?
Создайте метод, который будет 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();
}
}
в onDestroy()... openHelper.close();
В противном случае вы не сможете использовать android SimpleCursorAdapter или что-то в этом роде. Разумеется, в этом вопросе очень не хватает документов andriod. Но, помните, getWriteableDatabase() всегда возвращает одну и ту же кешированную ссылку каждый раз, если вы ее не закрыли. Итак, если вы закрываете эту ссылку волей-неволей, фоновые потоки и то, что нет, которые используют одну и ту же базу данных, умрут.