Użyłem cursor.moveToLast()
, a to pozwoliło mi używać kursora do iteracji po zamknięciu bazy danych. Nie mam pojęcia, czy to jest zamierzone.
Jednak wydaje się, że zamierzonym zastosowaniem otwartego schematu pomocniczego jest otwarcie bazy danych przy uruchomieniu działania i zamknięcie go po zniszczeniu działania.
W AsyncTask od wewnątrz onCreate() ...
new StartupTask().execute();
AsyncTask Thread.Sleep() poniżej jest po prostu dać wystarczająco dużo czasu, aby pokazać okno tak, że widać to działa. Oczywiście, kiedy skończysz grać. ;)
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();
}
}
w onDestroy() ... openHelper.close();
W przeciwnym razie nie będzie można korzystać z SimpleCursorAdapter na Androida ani niczego w tym stylu. Oczywiście doktorzy andriod bardzo brakuje w tym zakresie.Ale pamiętaj, że getWriteableDatabase() zawsze zwraca to samo odwołanie do pamięci podręcznej za każdym razem, chyba że je zamknąłeś. Jeśli więc zamkniesz to odniesienie, chcąc nie chcąc, wątki w tle i co nie, które używają tej samej bazy danych, zginą.