1

エミュレーターでもテスト済みのAndroidデバイスでも再現できないという、本当に奇妙な問題があります。

私のデータアクセス関数をすべて保持する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;  
    }

アプリケーションの起動時に、更新を確認する非同期タスクを作成し、このプロセスでデータベース内のローカル テーブルの存在を確認します。

スローされたエラーは Cursor cursor = 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 によると、これはさまざまなデバイスで数回発生しています。

誰かがこれについて私に光を当てることができますか?

ありがとう。

4

1 に答える 1

0

Please put that second cursor.close(); inside the else blocks follows

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;  
    }
于 2012-09-14T08:31:41.350 に答える