如何在Toast中展示Sqlite触发器抛出的提示信息及语法问题排查
触发器语法错误修复
你的错误核心是字符串拼接时缺少必要空格,拼接后各语法关键字连在一起导致SQL解析失败,原始代码拼接完成后SQL语句会变成CREATE TRIGGER insert_validationBEFORE INSERT on farmer_detBEGIN SELECT...,完全不符合SQLite语法规范。
同时建议补充空值判断,避免用户输入null值绕过校验,修正后的触发器创建代码如下:
String farmer_insert_trigger = "CREATE TRIGGER insert_validation " + "BEFORE INSERT ON farmer_det " + "BEGIN " + "SELECT CASE WHEN new.farmer_name IS '' OR new.farmer_name IS NULL THEN " + "RAISE(ABORT, 'Farmer Name is mandatory') " + "END; " + "END;"; // 触发器只需要创建一次,放到SQLiteOpenHelper的onCreate/onUpgrade方法中执行即可,不要每次点击按钮都调用 public void createTriggers(SQLiteDatabase db) { db.execSQL(farmer_insert_trigger); }
点击事件逻辑修正
你当前的代码存在两个逻辑问题:
- 每次点击都重复创建触发器,第二次点击就会报触发器已存在的错误
- 没有执行插入操作,根本不会触发触发器的校验逻辑,且默认的
insert()方法不会抛出异常,需要用insertOrThrow()才能拿到触发器返回的错误信息
修正后的点击事件代码如下:
btn.setOnClickListener(v->{ String farmerID = farmer_id.getText().toString().trim(); String farmerName = farmer_name.getText().toString().trim(); String fatherName = father_name.getText().toString().trim(); try { SQLiteDatabase db = dbHandler.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("farmer_id", farmerID); values.put("farmer_name", farmerName); values.put("father_name", fatherName); // 执行插入操作,此时会触发触发器校验 db.insertOrThrow("farmer_det", null, values); Toast.makeText(MainActivity.this, "数据插入成功", Toast.LENGTH_SHORT).show(); } catch (SQLiteConstraintException e) { // 触发器抛出的错误会在这里被捕获,直接取异常信息展示即可 Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show(); } catch (Exception e) { Toast.makeText(MainActivity.this, "操作失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } });
内容的提问来源于stack exchange,提问作者Venkatesh
相关产品推荐
相关产品推荐

