2011-11-01 47 views
14

首先,糾正我,如果我錯了,但如果關閉數據庫連接,你不能使用它從你得到的光標,是嗎?Android - 關閉數據庫後可以使用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)); 

那麼在關閉數據庫後有沒有辦法使用Cursor?有什麼方法可以將它傳遞到其他地方,並使用它有點像一個對象?或者你總是不得不打開數據庫連接,直到完成遊標?

回答

3

首先,糾正我,如果我錯了,但如果你關閉數據庫連接 ,你不能使用你從中得到的,正確的光標?

正確。

那麼在關閉數據庫後有沒有辦法使用Cursor?

我不這麼認爲。當我完成Cursor時,我總是關閉數據庫,即使我將光標傳遞給另一個Cursor對象。

像有什麼方法可以將它傳遞到別處,並使用它有點像一個 對象?

創建方法將return cursorobject;並在任何需要它的地方使用該方法。 (請在完成後還可以創建方法,將關閉DB)

或者你總是要離開的數據庫連接打開,直到您 與光標做了什麼?

否則,光標會旋上。

0

我使用cursor.moveToLast(),它允許我在數據庫關閉後使用遊標進行迭代。我不知道這是否是故意的。

但是,似乎打開幫助程序框架的打算用途是在活動開始時打開數據庫,並在活動被銷燬時關閉它。

在從的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或類似的東西。當然,安德里奧特文件在這方面非常缺乏。但是,請記住,除非關閉了getWriteableDatabase(),否則每次都會返回相同的緩存引用。所以,如果你無條件地關閉該引用,後臺線程以及不在使用同一個數據庫的內容將會死亡。

相關問題