2011-11-01 10 views
14

Po pierwsze, popraw mnie, jeśli się mylę, ale jeśli zamkniesz połączenie z bazą danych, nie możesz użyć kursora, który z niego masz, prawda?Android - czy po zamknięciu bazy danych można użyć kursora 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)); 

Czy istnieje sposób użycia kursora po zamknięciu bazy danych? Czy istnieje jakiś sposób przekazania go gdzie indziej i użycia go jako obiektu? Czy zawsze musisz pozostawić połączenie z bazą danych otwarte, dopóki nie skończysz z kursorem?

Odpowiedz

3

Przede wszystkim, poprawcie mnie jeśli się mylę, ale jeśli zamknąć bazie połączenia, nie można używać kursora co masz z nim, prawda?

Prawidłowo.

Czy istnieje sposób użycia Kursora po zamknięciu bazy danych?

Nie sądzę. Zawsze zamykałem bazę danych po zakończeniu pracy z kursorem, nawet jeśli przekazałem kursor do innego obiektu Cursor.

jak jest jakiś sposób, aby przekazać je gdzie indziej i używać go trochę jak przedmiot ?

Utwórz metodę, która będzie return cursorobject; i użyj metody tam, gdzie jej potrzebujesz. (Również stworzyć metodę, która będzie zamknąć db po zakończeniu)

Albo zawsze musisz zostawić otwarte połączenie z bazą danych, aż są wykonane z kursorem?

W przeciwnym razie kursor zostanie skręcony.

0

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ą.

Powiązane problemy