#android #sqlite #triggers
Вопрос:
Я пытаюсь использовать триггер sqlite перед вставкой концепции для проверки в Android studio. Я использую 3 поля — идентификатор фермы, имя фермы, имя отца, и если имя фермы пустое, я пытаюсь отобразить сообщение об ошибке «Имя фермера обязательно». Поэтому я использовал кодирование триггера, как показано ниже, в Android studio
String farmer_insert_trigger = "CREATE TRIGGER insert_validation" "BEFORE INSERT on farmer_det" "BEGIN SELECT CASE WHEN new.farmer_name IS '' THEN" "RAISE(ABORT,'Farmer Name is mandatory')" "end;" "end;"; public void createTriggers() { SQLiteDatabase db = this.getWritableDatabase(); db.execSQL(farmer_insert_trigger); }
когда я нажимаю кнопку «Отправить», чтобы отобразить сообщение об ошибке как «Имя фермера обязательно», я получаю сообщение об ошибке как «рядом с «ВЫБРАТЬ»:синтаксическая ошибка (код 1);, при заполнении СОЗДАТЬ триггер…». Ниже мое событие нажатия кнопки.
btn.setOnClickListener(v-gt;{ String farmerID = farmer_id.getText().toString(); String farmerName = farmer_name.getText().toString(); String fatherName = father_name.getText().toString(); try { // Execute insert function dbHandler.createTriggers(); } catch (SQLiteConstraintException e) { Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show(); } catch (Exception e) { // Just in case the above doesn't catch it Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show(); } });
Я пропустил какой-либо синтаксис при создании триггера.
Ответ №1:
Я считаю, что вам не хватает мест там, где они необходимы / необходимы.
Попробуй :-
String farmer_insert_trigger = "CREATE TRIGGER insert_validation /*SPACE*/" "BEFORE INSERT on farmer_det /*SPACE*/" "BEGIN SELECT CASE WHEN new.farmer_name IS '' THEN /*SPACE*/" "RAISE(ABORT,'Farmer Name is mandatory')" "end;" "end;";
- Очевидно, комментарии
/*SPACE*/
не нужны.
Комментарии:
1. Да, это работает fine…is есть любой способ получить сообщение о повышении в одиночку — имя фермера обязательно. Поскольку я вызываю полные триггеры, я получаю полный код триггеров в своем тосте.
2. @Venkatesh просто сохрани сообщение как константу и используй его в прерывании и тосте.
3. Спасибо @MikeT, вы хотите сказать, что «Строка err_ins = » Имя фермера обязательно»;» и передаете это «»ПОДНЯТЬ(ПРЕРВАТЬ,err_ins)» » … что-то вроде этого мне нужно использовать…пожалуйста, поправьте меня, если я ошибаюсь…
4. @Venkatesh Больше похоже
public static final String ERR_INS = "Farmer Name is mandatory";
на то, чтобы закодировать его в подходящем классе, и вы можете получить к нему доступ в любом месте. Аналогично тому, как вы можете использоватьToast.LENGTH_LONG
, т. е.Toast
класс будет иметь что-то вродеpublic static final int LENGTH_SHORT = 1;
Ответ №2:
Чтобы отобразить всплывающее сообщение SQLite в тосте, мы можем использовать выражение регулярного выражения. Я использовал приведенный ниже набор кода для отображения необходимого сообщения в одинарных кавычках (который находится в ПОВЫШЕНИИ).
Pattern p = Pattern.compile(".*'([^']*)'.*"); Matcher m1 = p.matcher(str); if (m1.matches()) { // Print the required sub-string System.out.println("Extracted part : " m1.group(1)); Toast.makeText(MainActivity.this, "" m1.group(1), Toast.LENGTH_SHORT).show(); }
Ответ №3:
Вы можете проверить, пуста ли строка непосредственно из программы, как это :
btn.setOnClickListener(v-gt;{ String farmerID = farmer_id.getText().toString(); String farmerName = farmer_name.getText().toString(); String fatherName = father_name.getText().toString(); if (farmerName.equals("")) { Toast.makeText(getApplicationContext(), "Farmer Name is mandatory", Toast.LENGTH_LONG).show(); } else { // Execute insert function } });
Программа может компилироваться быстрее, потому что вам не нужно проверять базу данных, а код проще.
Комментарии:
1. Да @Rahmad….Но мне нужно показать сообщение об ошибке из триггеров SQLite, которое я создал в триггере как «Имя фермера обязательно»…
2. @Venkatesh Похоже, что в вашем синтаксисе триггера создания отсутствуют некоторые пробелы