2011-11-01 1 views
14

Prima di tutto, correggimi se ho torto, ma se chiudi una connessione al database, non puoi usare il Cursore che hai ricevuto, correggere?Android: è possibile utilizzare i cursori di SQLite dopo aver chiuso il database?

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

Quindi è possibile utilizzare il Cursore dopo aver chiuso il database? Come c'è un modo per passarlo altrove e usarlo come un oggetto? O devi sempre lasciare aperta la connessione al database finché non hai finito con il cursore?

risposta

3

Prima di tutto, mi corregga se sbaglio, ma se si chiude una connessione al database , non è possibile utilizzare il cursore che hai da esso, giusto?

Corretto.

Quindi è possibile utilizzare il Cursore dopo aver chiuso il database?

Non credo. Ho sempre chiuso il database quando ho finito con il Cursore, anche se passo il cursore su un altro oggetto Cursore.

Come c'è un modo per passarlo altrove e usarlo come un oggetto ?

Creare un metodo che sia return cursorobject; e utilizzare il metodo ovunque sia necessario. (Anche creare metodo che si chiuderà db dopo aver terminato)

O avete sempre lasciare la connessione al database aperta fino a quando non è fatto con il cursore?

Altrimenti il ​​cursore si rovinerà.

0

Ho utilizzato cursor.moveToLast() e mi ha consentito di utilizzare il cursore per l'iterazione dopo la chiusura del database. Non ho idea se questo è intenzionale.

Tuttavia, sembra che l'uso previsto del framework di helper aperto sia quello di aprire il db all'avvio dell'attività e chiuderlo quando l'attività viene distrutta.

In un AsyncTask dall'interno onCreate() ...

new StartupTask().execute(); 

L'AsyncTask Thread.sleep() di seguito è solo per dare il tempo sufficiente per mostrare la finestra di dialogo in modo che si può vedere il lavoro. Ovviamente prendilo quando hai finito di giocare. ;)

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

In caso contrario, non sarà possibile utilizzare Android SimpleCursorAdapter o qualcosa di simile. Naturalmente i documenti di andriod sono molto carenti in questo senso.Ma, ricorda, getWriteableDatabase() restituisce sempre lo stesso riferimento memorizzato nella cache, ogni volta, a meno che non lo si chiuda. Quindi, se vai a chiudere quel riferimento, volenti o nolenti, thread in background e cosa no, che stanno usando lo stesso database, morirà.