2012-09-14 116 views
0

我有一個非常奇怪的問題,我無法在仿真器或任何測試的android設備上重現。Android java.lang.IllegalStateException數據庫已關閉

我有一個SQLite數據庫控制器持有的所有地雷的數據訪問功能,在這個類中,我有一個簡單的函數來檢查表是否存在:

public boolean tableExists(String tableName) { 
    if(db==null || !db.isOpen()) db = dbhelper.getWritableDatabase();  
    Cursor cursor = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table' AND name='"+tableName+"'", null); 
     if(cursor!=null) { 
      if(cursor.getCount()>0) { 
       cursor.close(); 
       return true; 
      } 
      cursor.close(); 
      } 
     return false; 
    } 

在我的應用程序開始我創建一個異步任務檢查更新並在此過程中,我將檢查數據庫中是否存在本地表。

拋出的錯誤是在光標光標= db.rawQuery(...線和錯誤是:

java.lang.IllegalStateException:數據庫... db.sqlite已經關閉

java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:200) 
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
at java.lang.Thread.run(Thread.java:1019) 
Caused by: java.lang.IllegalStateException: database /data/data/com.xxx.xxx.xxx.android/databases/db.sqlite already closed 
at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:59) 
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83) 
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49) 
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42) 
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1364) 
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1332) 
at com.xxx.xxx.xxx.utils.SQLiteController.tableExists(SQLiteController.java:1463) 

我不能重現這個錯誤,但根據ACRA這是在不同的設備上發生的幾次。

能有人給我一盞燈呢?

謝謝。

+0

...因爲這代碼是在的AsyncTask,檢查,如果它不叫兩次(我是指兩種的AsyncTask同時運行) – Selvin

+0

謝謝,我有檢查,似乎沒有。這可能是一個有效的點,因爲它們可以根據方向更改進行重新創建,但特定的異步任務不會在先前的方向更改中觸發。所以我仍然堅持。 –

回答

0

請把else塊內部的第二cursor.close();如下

public boolean tableExists(String tableName) { 
    if(db==null || !db.isOpen()) db = dbhelper.getWritableDatabase();  
    Cursor cursor = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table' AND name='"+tableName+"'", null); 
     if(cursor!=null) { 
      if(cursor.getCount()>0) { 
       cursor.close(); 
       return true; 
      } 
      else{ 
        cursor.close(); 
       } 
      } 
     return false; 
    } 
+1

它似乎不是問題的根源。該錯誤在rawQuery行上。 如果cursor.getCount()> 0不正確,則執行else:正確,但仍然發生在我的代碼上,如果if語句爲true,則返回true並停止代碼,函數exit。 cursor.close()永遠不會執行兩次。 –

+0

@莫喬你能告訴我們什麼? – Selvin

+0

我發佈了IF成功的場景,光標將在裏面關閉,但你又試圖關閉它; –

相關問題