この特定のエラー メッセージに関する同様の質問が、スタック オーバーフローで何度か寄せられています。自分の状況に合うものが見つかりませんでした。それで、ここに行きます。
query
Strict モードをオンにすると、コンテンツ プロバイダーのメソッドでこのエラーが発生します。私のコンテンツ プロバイダのクエリ メソッドは以下を呼び出しqueryDirections(...)
ます。メソッドを呼び出しdb.query
てカーソルを返すだけです。このカーソルを閉じるにはどうすればよいですか? コンパイラは、カーソルが閉じられていないその下の行 return ステートメントで不平を言います。詳細なエラー メッセージは次のとおりです。ありがとう。
コンテンツ プロバイダー
private Cursor queryDirections(Uri uri, String[] columns,
String selection, String[] selectionArguments,
String sortOrder) {
SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
return db.query(C.Db.TABLE_DIRECTIONS, columns,
selection, selectionArguments, null, null, sortOrder);
}
アクティビティから呼び出される
continued...
case R.id.spinnerStops:
AsyncQueryHandler handler = new AsyncQueryHandler(getContentResolver()) {
@Override
protected void onQueryComplete(int token, Object cookie, Cursor stopCursor) {
stopCursor.moveToFirst();
int columnIndex = stopCursor.getColumnIndex(Stop.KEY_TAG);
if (stopCursor.getCount() > 0) {
mStopTag = stopCursor.getString(columnIndex);
stopCursor.close();
}
};
};
handler.startQuery(1, null, C.ContentUri.STOP,
new String[] {
C.Db.TABLE_STOPS + "." + Stop.KEY_TITLE,
C.Db.TABLE_STOPS + "." + Stop.KEY_TAG },
"Stops._id=" + id, null, null);
break;
また、2 つのスピナー アダプターの onStop をオーバーライドしました
@Override
protected void onStop() {
MyLogger.log("closing cursor");
try {
if (mStopsAdapter != null) {
mStopsAdapter.getCursor().close();
mStopsAdapter = null;
}
if (mDirectionAdapter != null) {
mDirectionAdapter.getCursor().close();
mDirectionAdapter = null;
}
} catch (Exception e) {
}
super.onStop();
}
エラーメッセージ
05-31 23:30:23.295: E/StrictMode(28918): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.thuptencho.torontotransitbus/databases/appdb.db, table = directions, query = SELECT tag FROM directions WHERE _id=-999
05-31 23:30:23.295: E/StrictMode(28918): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
05-31 23:30:23.295: E/StrictMode(28918): at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:98)
05-31 23:30:23.295: E/StrictMode(28918): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:50)
05-31 23:30:23.295: E/StrictMode(28918): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
05-31 23:30:23.295: E/StrictMode(28918): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161)
05-31 23:30:23.295: E/StrictMode(28918): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
05-31 23:30:23.295: E/StrictMode(28918): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1200)
05-31 23:30:23.295: E/StrictMode(28918): at com.thuptencho.torontotransitbus.provider.TheContentProvider.queryDirections(TheContentProvider.java:169)
05-31 23:30:23.295: E/StrictMode(28918): at com.thuptencho.torontotransitbus.provider.TheContentProvider.query(TheContentProvider.java:109)
05-31 23:30:23.295: E/StrictMode(28918): at android.content.ContentProvider.query(ContentProvider.java:652)
05-31 23:30:23.295: E/StrictMode(28918): at android.content.ContentProvider$Transport.query(ContentProvider.java:189)
05-31 23:30:23.295: E/StrictMode(28918): at android.content.ContentResolver.query(ContentResolver.java:372)
05-31 23:30:23.295: E/StrictMode(28918): at android.content.ContentResolver.query(ContentResolver.java:315)
05-31 23:30:23.295: E/StrictMode(28918): at android.content.AsyncQueryHandler$WorkerHandler.handleMessage(AsyncQueryHandler.java:79)
05-31 23:30:23.295: E/StrictMode(28918): at android.os.Handler.dispatchMessage(Handler.java:99)
05-31 23:30:23.295: E/StrictMode(28918): at android.os.Looper.loop(Looper.java:137)
05-31 23:30:23.295: E/StrictMode(28918): at android.os.HandlerThread.run(HandlerThread.java:60)