【问题标题】:How to show Sqlite Triggers Raise message in toast如何在吐司中显示 Sqlite 触发器引发消息
【发布时间】:2021-12-31 20:31:49
【问题描述】:

我正在尝试在 android studio 中插入验证概念之前使用 sqlite 触发器。我正在使用 3 个字段 - farmer_id、farmer_name、father_name,如果 farmer_name 为空,我试图显示错误消息为“Farmer Name is required”。所以我在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);
    }

当我点击“提交”按钮以将错误消息显示为“农民姓名是必需的”时,在编译 CREATE Triger 时收到错误消息为 “在“SELECT”附近:语法错误(代码 1);。 .."。 下面是我的按钮点击事件。

btn.setOnClickListener(v->{
            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();
            }        
        });

我在创建触发器时是否遗漏了任何语法。

【问题讨论】:

    标签: android sqlite triggers


    【解决方案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;";
    
    • 显然 cmets /*SPACE*/ 不需要。

    【讨论】:

    • 是的,它工作正常...有没有办法单独获得加薪信息 - 农民姓名是强制性的。由于我调用了完整的触发器,因此在我的 toast 中获取了完整的触发器代码。
    • @Venkatesh 只是将消息作为常量并在中止和吐司中使用它。
    • 谢谢@MikeT,你的意思是说,` String err_ins = "Farmer Name is required";` 并将其传递给 ` "RAISE(ABORT,err_ins)" +`... 类似这个我需要使用...如果错了请纠正我...
    • @Venkatesh 更像public static final String ERR_INS = "Farmer Name is mandatory"; 将其编码到合适的类中,您可以在任何地方访问它。类似于你如何使用Toast.LENGTH_LONGToast 类将有类似public static final int LENGTH_SHORT = 1;
    【解决方案2】:

    要在 toast 中显示 SQLite toast 消息,我们可以使用 REGEX 表达式。我使用下面的代码集在单引号内显示​​所需的消息(在 RAISE 中)。

    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->{
              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
                  }        
          });
      

      程序编译速度更快,因为不需要查数据库,代码更简单。

      【讨论】:

      • 是的@Rahmad....但是我需要显示来自 SQLite 触发器的错误消息,我在触发器中创建为“农民姓名是强制性的”...
      • @Venkatesh 您的创建触发器语法似乎缺少一些空格
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      相关资源
      最近更新 更多