Дано: диалоговое окно, при нажатии на которое появляется ошибка 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)
catch
не работает потому что исключение перехватывается в SQLite
и просто пишется в лог.
Попробуйте метод для вставки insertOrThrow
или insertWithOnConflict
с алгоритмом SQLiteDatabase.CONFLICT_FAIL
. Тогда Exception
пробросится до Вашего catch
Подробнее: тут и тут
Возможно в catch блоке вы перехватываете не тот тип исключения. Например используете java.sql.SQLException вместо android.database.SQLException.
Судя по логу у вас происходит android.database.sqlite.SQLiteConstraintException исключение. Можно перехватывать в catch непосредственно его SQLiteConstraintException, либо соответственно одно из супер исключений:
Попробуйте так:
} catch (android.database.SQLException e)
либо так:
} catch (SQLiteConstraintException e)
либо так:
} catch (Exception e)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
В компоненте DIALOG_TIME не обнаружил секунд, а они мне нужныМожно ли как-то их добавить? Или есть какая нибудь альтернатива, для того чтобы осуществлялся...
Как можно вычислить Load Average системы с ОС Windows? (Язык программирования - java)Sigar API и OperatingSystemMXBean не вычисляют Load Average под Windows
Есть БД Realm, которая хранит объекты с записями о действиях пользователяСтруктура объекта с записью такая: timestamp с датой и коллекция действий...