Android SQLite在更新触发器上

问题描述

| 我在Android中使用SQLite遇到了一些麻烦。由于我的应用程序支持Android 1.6,因此我无法使用外键,因此编写了触发器来强制执行这些约束。 我的两个表是vehicle和fuel_use。 vehicle和fuel_use都有一个registration_number列。我的触发器确保当fuel_use中的条目引用车辆中的registration_number时,我无法更新车辆中的registration_number:
        //on update vehicle
    db.execSQL(\"CREATE TRIGGER fk_update_vehicle_trigger_fuel_references_vehicles_reg_no \" +
            \"BEFORE UPDATE ON \" + VEHICLE_TABLE_NAME +
            \" FOR EACH ROW BEGIN \" +
            \"SELECT RAISE(ROLLBACK,\'update on table \" + VEHICLE_TABLE_NAME + \" violates foreign key constraint fk_update_vehicle_trigger_fuel_references_vehicles_reg_no\') \" +
            \"WHERE (SELECT \" + REGISTRATION_NO_COLUMN + \" FROM \" + FUEL_USE_TABLE_NAME +
            \" WHERE \" + REGISTRATION_NO_COLUMN + \" = OLD.\" + REGISTRATION_NO_COLUMN + \") IS NOT NULL; \" +
            \"END;\");
这可以正常工作,因为它会停止更新,这将使fuel_use行引用不存在的车辆行。但是,我刚刚发现了一个问题-当我尝试更新车辆中的其他列时-initial_mileage-此触发器不允许它并强制回滚。我知道为什么会发生这种情况,但不知道如何重写触发器,因此仅对registration_number列进行更新会强制回滚。我试过了:
BEFORE UPDATE ON \" + VEHICLE_TABLE_NAME + \".\" + REGISTRATION_NO_COLUMN
但这没有用。实际上,引发了异常。 任何帮助将不胜感激。     

解决方法

尝试:
db.execSQL(\"CREATE TRIGGER fk_update_vehicle_trigger_fuel_references_vehicles_reg_no \" +
        \"BEFORE UPDATE OF \" + REGISTRATION_NO_COLUMN + \" ON \" + VEHICLE_TABLE_NAME +
        \" FOR EACH ROW BEGIN \" +
        \"SELECT RAISE(ROLLBACK,\'update on table \" + VEHICLE_TABLE_NAME + \" violates foreign key constraint fk_update_vehicle_trigger_fuel_references_vehicles_reg_no\') \" +
        \"WHERE (SELECT \" + REGISTRATION_NO_COLUMN + \" FROM \" + FUEL_USE_TABLE_NAME +
        \" WHERE \" + REGISTRATION_NO_COLUMN + \" = OLD.\" + REGISTRATION_NO_COLUMN + \") IS NOT NULL; \" +
        \"END;\");
看看是否可行。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...