Я использую ограничение внешнего ключа onDelete RESTRICT
, поэтому, когда у родителя есть дочерние элементы с FK, его нельзя удалить. Это работает правильно. Однако мне нужно предупредить пользователя, когда выдается SQLiteConstraintException
, и я использую для этого блок try-catch-finally. Однако я никогда не получаю его, чтобы войти в блок захвата, и никакое предупреждение не вызвано Исключение также вызывает сбой во время выполнения, поэтому его нужно обрабатывать некоторым образом.
Я пытался расширить исключение, используя SQLiteException
и SQLException
, но оно все равно не работает, несмотря на получение android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 1811 SQLITE_CONSTRAINT_TRIGGER)
Удаление запускается в меню с оператором switch:
switch (item.getItemId()) {
...
case R.id.delete_term:
try{
mViewModel.deleteTerm();
}catch (SQLiteConstraintException ex){
AlertDialog.Builder a_builder = new
AlertDialog.Builder(TermEditorActivity.this);
a_builder.setMessage("Courses are assigned for this term
and it cannot be deleted." +
"\n\nYou must remove all courses prior to deleting a
term.")
.setCancelable(false)
.setPositiveButton("Okay", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
dialog.cancel();
finish();
}
});
AlertDialog deleteAllAlert = a_builder.create();
deleteAllAlert.setTitle("CANNOT DELETE TERM!!!");
deleteAllAlert.show();
}finally {
startActivity(new Intent(TermEditorActivity.this,
MainActivity.class));
}
return true;
default:
return super.onOptionsItemSelected(item);
}
Журнал аварий:
android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 1811 SQLITE_CONSTRAINT_TRIGGER)
at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:784)
at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
at android.arch.persistence.db.framework.FrameworkSQLiteStatement.executeUpdateDelete(FrameworkSQLiteStatement.java:45)
at android.arch.persistence.room.EntityDeletionOrUpdateAdapter.handle(EntityDeletionOrUpdateAdapter.java:70)
at com.mattspriggs.termtest.database.TermDao_Impl.deleteTerm(TermDao_Impl.java:144)
at com.mattspriggs.termtest.database.AppRepository$4.run(AppRepository.java:83)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Метод из строки AppRepository 83:
termDb.termDao().deleteTerm(term);
Метод deleteTerm из TermDAO:
@Delete
void deleteTerm(TermEntity termEntity);
Я надеюсь поймать исключение и отправить использование обратно на экран редактирования, где они пытались удалить термин. Пока что это не работает, как задумано. Заранее благодарю за помощь.