Попытка поймать исключение SQLiteConstraintException в Android Room и отобразить предупреждение - PullRequest
0 голосов
/ 21 июня 2019

Я использую ограничение внешнего ключа 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);

Я надеюсь поймать исключение и отправить использование обратно на экран редактирования, где они пытались удалить термин. Пока что это не работает, как задумано. Заранее благодарю за помощь.

1 Ответ

0 голосов
/ 21 июня 2019

Документация RESTRICT При чтении документации по RESTRICT, это вызывает немедленную ошибку, а не исключение.Похоже, что ошибки SQLite не могут быть пойманы (?) В инструкции try-catch?Считаются ли они серьезными ошибками?Я думаю, что мне нужно будет запросить наличие детей, прежде чем разрешить удаление.Однако я не могу вернуть количество элементов из простого запроса, поэтому мой процесс запроса неверен?В соответствии с документацией Callable , Runnable не может вернуть значение, поэтому я не смог получить счетчик из запроса к БД.

Я решил, что это совсем другой метод.подход.Я поместил recyclerView в более раннее действие и смог зафиксировать число дочерних элементов (и отобразить эти дочерние элементы в представлении) и отправить его в действие редактора, где происходит удаление, и обработать удаление с помощью оператора if-then вместоловить исключение.Я никогда не мог поймать исключение.Все, что я могу понять, это то, что это исключение в Android, но ошибка в SQLite?

Если кто-нибудь узнает, как перехватить исключение SQLiteConstraintException, я хотел бы знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...