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