Как поймать исключение и показать alert dialog

255
01 марта 2017, 19:45

Дано: диалоговое окно, при нажатии на которое появляется ошибка android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed (что это за ошибка и почему появляется я знаю)

Нужно: поймать это исключение и вывести сообщение (другое диалоговое окно "Запись уже существует!")

Вопрос: как это реализовать? на сколько я понял, блок catch не срабатывает, т.к. в логе не покавывает мое сообщение

Важно: чтоб при нажатии кнопки ОК первое диалоговое окно не закрылось, если появилась ошибка

private void showAddArticleDialog() {
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
    LayoutInflater inflater = this.getLayoutInflater();
    final View dialogView = inflater.inflate(R.layout.add_article_dialog, null);
    dialogBuilder.setView(dialogView);
    final EditText edt = (EditText) dialogView.findViewById(R.id.edit1);
    String title = "";
    //String message = "Enter text below";
    if(TYPE){
        title = getString(R.string.title_add_income_article);
    }else{
        title = getString(R.string.title_add_cost_article);
    }
    dialogBuilder.setTitle(title);
    //dialogBuilder.setMessage(message);
    dialogBuilder.setPositiveButton(getString(R.string.ok_button), new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            try {
                myDb.addCategory(edt.getText().toString(), R.drawable.star, TYPE);
            } catch (SQLException e) {
                e.printStackTrace();
                //showLog(getString(R.string.this_article_exists));
                Log.e("ERROR", "ERROR IN CODE: " + e.toString() + " ------- " + R.string.this_article_exists);
            }
            initializeAdapter();
        }
    });
    dialogBuilder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            //pass
        }
    });
    AlertDialog b = dialogBuilder.create();
    b.show();
}

Вот лог:

02-28 12:28:04.891 23792-23792/ru.by_em.my_finances E/SQLiteLog: (2067) abort at 17 in [INSERT INTO direction(category_name,category_photo,_id) VALUES (?,?,?)]: UNIQUE constraint failed: direction.category_name
02-28 12:28:04.896 23792-23792/ru.by_em.my_finances E/SQLiteDatabase: Error inserting category_name=Обеды category_photo=2130837652 _id=13
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: direction.category_name (code 2067)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:952)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1595)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1465)
at ru.by_em.my_finances.db.DBDataSource.addCategory(DBDataSource.java:241)
at ru.by_em.my_finances.activities.ChangeArticlesActivity$1.onClick(ChangeArticlesActivity.java:100)
at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:161)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5951)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
Answer 1

catch не работает потому что исключение перехватывается в SQLite и просто пишется в лог.

Попробуйте метод для вставки insertOrThrow или insertWithOnConflict с алгоритмом SQLiteDatabase.CONFLICT_FAIL. Тогда Exception пробросится до Вашего catch

Подробнее: тут и тут

Answer 2

Возможно в catch блоке вы перехватываете не тот тип исключения. Например используете java.sql.SQLException вместо android.database.SQLException.

Судя по логу у вас происходит android.database.sqlite.SQLiteConstraintException исключение. Можно перехватывать в catch непосредственно его SQLiteConstraintException, либо соответственно одно из супер исключений:

  • android.database.sqlite.SQLiteException
  • android.database.SQLException
  • java.lang.RuntimeException
  • java.lang.Exception.

Попробуйте так:

} catch (android.database.SQLException e)

либо так:

} catch (SQLiteConstraintException e)

либо так:

} catch (Exception e)
READ ALSO
Можно ли DIALOG_TIME добавить секунды?

Можно ли DIALOG_TIME добавить секунды?

В компоненте DIALOG_TIME не обнаружил секунд, а они мне нужныМожно ли как-то их добавить? Или есть какая нибудь альтернатива, для того чтобы осуществлялся...

194
Динамическая компиляция класса java

Динамическая компиляция класса java

При компиляции Diagnostic выдает package orgapache

269
Вычисление Load Average для Windows

Вычисление Load Average для Windows

Как можно вычислить Load Average системы с ОС Windows? (Язык программирования - java)Sigar API и OperatingSystemMXBean не вычисляют Load Average под Windows

331
Как узнать разницу между датами с минимальный интревалом в один день?

Как узнать разницу между датами с минимальный интревалом в один день?

Есть БД Realm, которая хранит объекты с записями о действиях пользователяСтруктура объекта с записью такая: timestamp с датой и коллекция действий...

215