2012-04-10 11 views
2

Androidシステムは自動的に開いているSQLiteデータベースを閉じますか?私はデータにアクセスするためのシングルトンクラスを実装しましたが、時にはそのメソッドをワーカースレッド上で実行する必要があります。あなたが見ることができるように、私はすでにオープン呼ばれてきましたAndroid:FCがsqliteを開いたときにデータベースを開いた

public ArrayList<ActualCall> getUnsentCalls(boolean forUnsentSignature) { 
    ArrayList<ActualCall> calls = new ArrayList<ActualCall>(); 

    Cursor c; 
    open(); 

    if (forUnsentSignature) 
     c = db.rawQuery("SELECT * FROM " + TXN_ACTUAL_CALL_COMPONENT 
       + " WHERE sentFlag=1 and sigSentFlag=?", new String[] {"0"}); 
    else 
     c = db.rawQuery("SELECT * FROM " + TXN_ACTUAL_CALL_COMPONENT 
       + " WHERE sentFlag=? AND signature != ''", new String[] {"0"}); 

    if (c.moveToFirst()) { 
     do { 
      if (!db.isOpen()) 
       open(); 
      ActualCall call = new ActualCall(); 

      call.setAcpComponentId(c.getString(c.getColumnIndex("acpComponentId"))); 
      call.setAcpDate(c.getString(c.getColumnIndex("acpDate"))); 
      call.setAcpId(c.getString(c.getColumnIndex("acpId"))); 
      call.setCallEndTime(c.getString(c.getColumnIndex("callEndTime"))); 
      call.setCallStartTime(c.getString(c.getColumnIndex("callStartTime"))); 
      call.setCoordinates(c.getString(c.getColumnIndex("coordinates"))); 
      call.setDeviceTimestamp(c.getString(c.getColumnIndex("deviceTimestamp"))); 
      call.setDoctorId(c.getString(c.getColumnIndex("doctorId"))); 
      call.setSignature(c.getString(c.getColumnIndex("signature"))); 
      call.setSigSentFlag(c.getString(c.getColumnIndex("sigSentFlag"))); 
      call.setTimeSpent(c.getString(c.getColumnIndex("timeSpent"))); 
      call.setSentFlag(c.getString(c.getColumnIndex("sentFlag"))); 
      call.setCoordinates(c.getString(c.getColumnIndex("coordinates"))); 

      calls.add(call); 

     } while (c.moveToNext()); 
    } 

    c.close(); 
    db.close(); 

    return calls; 
} 

()最初の行にはまだ私が伝えるエラーを取得しています:私は、バックグラウンドで実行するクエリとの同期機能を持って、ここのコードです私のデータベースはすでに閉鎖されています。ここでスタックトレースです:それが助け場合は、再度、上記の方法は、Threadクラスで呼び出され

java.lang.IllegalStateException: database  
/data/data/com.***.****/databases/****.db (conn# 0) already closed 
at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2123) 
at android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:398) 
at android.database.sqlite.SQLiteDatabase.lock(SQLiteDatabase.java:390) 
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:74) 
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:311) 
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:292) 
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:156) 
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:233) 
at com.***.****.datalayer.ESCAndroidDataLayer.getUnsentCalls(ESCAndroidDataLayer.java:5340) 
at com.***.****.synchall.SynchAll$UnsentSignatureSender.run(SynchAll.java:1750) 

。私は自動的に閉じられているSQLiteのについてのリンクを見つけたが、私は彼のソリューションを理解していない:http://darutk-oboegaki.blogspot.com/2011/03/sqlitedatabase-is-closed-automatically.html

答えて

0

db.acquireReferenceを(呼び出すようにしてください) c.moveToFirst前に()

db.acquireReference(); 

    if (c.moveToFirst()) { 

またはそれをdb.close()を "if(db.isOpen())"で囲むだけで十分です。

if (db.isOpen()) 
    { 
     db.close(); 
    } 

これはわかりませんが、これらは変更されます。

+0

私はバックグラウンドで作業中のロケーションフェッチャーを持っており、ロケーションをフェッチしてDBに保存します。私はそれが偶然に同時に発生する場合、これが私の他のデータベースへのアクセスに影響を及ぼすかどうかはわかりません。 –

関連する問題