アクションバーのメニューを押したときに AlertDialog を追加して、ユーザーが sqlite のアイテムのリストを保存/削除し続けたいと本当に確信しているかどうかを確認しましたが、以下のエラーが発生しています。また、AlertDialog を削除しようとしましたが、代わりに、ユーザーがアクションバーのメニューを押して、行ったばかりのアクションを通知した後、トーストを作成しましたが、それでも以下の同じエラーが発生しました。AlertDialog または Toast メッセージを削除すると、すべて正常に機能し、sqlite のアイテムを保存および削除できます。
09-22 10:26:09.865: E/AndroidRuntime(2341): FATAL EXCEPTION: main
09-22 10:26:09.865: E/AndroidRuntime(2341): java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.usjr.sss/databases/subjecttaken
09-22 10:26:09.865: E/AndroidRuntime(2341): at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
09-22 10:26:09.865: E/AndroidRuntime(2341): at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1489)
09-22 10:26:09.865: E/AndroidRuntime(2341): at com.usjr.sss.adapter.SubjectTakenDbAdapter.deleteAllSubjects(SubjectTakenDbAdapter.java:56)
09-22 10:26:09.865: E/AndroidRuntime(2341): at com.usjr.sss.activity.CourseFragmentActivity$2.onClick(CourseFragmentActivity.java:143)
09-22 10:26:09.865: E/AndroidRuntime(2341): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
09-22 10:26:09.865: E/AndroidRuntime(2341): at android.os.Handler.dispatchMessage(Handler.java:99)
09-22 10:26:09.865: E/AndroidRuntime(2341): at android.os.Looper.loop(Looper.java:137)
09-22 10:26:09.865: E/AndroidRuntime(2341): at android.app.ActivityThread.main(ActivityThread.java:5227)
09-22 10:26:09.865: E/AndroidRuntime(2341): at java.lang.reflect.Method.invokeNative(Native Method)
09-22 10:26:09.865: E/AndroidRuntime(2341): at java.lang.reflect.Method.invoke(Method.java:511)
09-22 10:26:09.865: E/AndroidRuntime(2341): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
09-22 10:26:09.865: E/AndroidRuntime(2341): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
09-22 10:26:09.865: E/AndroidRuntime(2341): at dalvik.system.NativeStart.main(Native Method)
これが私のコードです:
public boolean onOptionsItemSelected(MenuItem item) {
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this.
if (drawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle action buttons
switch (item.getItemId()) {
case R.id.action_save_subjects:
subjectTakenDbAdapter.open();
/**
* Delete from database all subjects taken if user does not select a
* subject & clicks save button
*/
if (arrayListSelectedSubject.isEmpty()) {
new AlertDialog.Builder(this).setMessage("Are you sure?")
.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
subjectTakenDbAdapter.deleteAllSubjects();
}
}).show();
} else {
/**
* Add subjects taken to database
*/
for (int index = 0; index < arrayListSelectedSubject.size(); index++) {
subjectTakenDbAdapter
.createSubjectTaken((arrayListSelectedSubject
.get(index)));
Log.i("ADD SUBJECT TAKEN",
arrayListSelectedSubject.get(index));
}// end for loop
}// end if-else
Cursor cursor = subjectTakenDbAdapter.fetchAllSubjectTaken();
Log.i("SubjectTakenDbAdapter", String.valueOf(cursor.getCount()));
subjectTakenDbAdapter.close();
return true;
default:
return super.onOptionsItemSelected(item);
}// end switch case
}// end onOptionsItemSelected
logcat は、このエラーの原因が次のコード行である CourseFragmentActivity.class の Java 行 143 を指していることを示しています。
subjectTakenDbAdapter.deleteAllSubjects();
私のSubjectTakenDbAdapter.classのJava行56は、次のコード行です。
return sqLiteDatabase.delete(DATABASE_TABLE, null, null) > 0;