5
を閉じた後Dbとを閉じる必要があります:アンドロイド:私たちはSQLiteCursor(スタックトレース)のソースコードからカーソル
at android.database.sqlite.SQLiteDatabase.dbclose(Native Method)
at android.database.sqlite.SQLiteDatabase.onAllReferencesReleased(SQLiteDatabase.java:325)
at android.database.sqlite.SQLiteClosable.releaseReference(SQLiteClosable.java:45)
at android.database.sqlite.SQLiteProgram.onAllReferencesReleased(SQLiteProgram.java:119)
at android.database.sqlite.SQLiteClosable.releaseReference(SQLiteClosable.java:45)
at android.database.sqlite.SQLiteProgram.close(SQLiteProgram.java:296)
at android.database.sqlite.SQLiteQuery.close(SQLiteQuery.java:136)
at android.database.sqlite.SQLiteCursor.close(SQLiteCursor.java:506)
それが最後のカーソルをクローズすると、データベースを閉じます、ということを意味します。そして、このコードのように明示的に閉じる必要はありません。
SQLiteDatabase rdb = db.getReadableDatabase();
Cursor resultCursor = null;
String patternQuery = SQLiteQueryBuilder.buildQueryString(true, "Store", columns, where, null, null, null, null);
try
{
resultCursor = rdb.rawQuery(patternQuery, null);
resultCursor.moveToFirst();
if (resultCursor.getCount() > 0)
{
while (!resultCursor.isAfterLast())
{
result.add(resultCursor.getString(0));
resultCursor.moveToNext();
}
}
}
catch (Exception e)
{
Log.d("DB", "Caught an exception while getting pattern based results: " + e);
}
finally
{
if (resultCursor != null)
{
resultCursor.close();
}
if (rdb.isOpen())
{
rdb.close();
}
}
ここで、rdbを閉じる必要はありませんか?
注:カーソルオブジェクトはデータベースへの参照を保持しているため、各クエリで同じオブジェクトにロックされます。したがって、 'SQLiteDatabse.dbclose'は実質的に同じデータベースを閉じます。
stack-traceは、終了カーソルもデータベースを閉じることを示します。このようなシナリオではDBを閉じる必要はありません。私はここでいくつかのポイントを逃している場合は言及してください。 – PushpRaj
私はちょうどあなたが行方不明だと言った。 :/あなたはまた、データベースを閉じる必要があります。データベースがまだ明示的に閉じられていない場合(実際にシャットダウンする前にすべての未処理のカーソルが閉じられるのを待っている場合)、ここを見ている時点で閉じられません。 – hackbod
私が見たところでは、データベースを閉じてカーソルを閉じようとすると、 '接続プールが閉じられたためこの操作を実行できません.'という例外が発生します。したがって、カーソルを待つことはありません。 – ElyashivLavi