更新触发器上的Android SQLite

时间:2011-05-25 19:13:06

标签: android sqlite triggers

我在Android中使用SQLite时遇到了一些麻烦。由于我的应用程序支持Android 1.6,因此我无法使用外键,因此编写了触发器以强制执行这些约束。

我的两张桌子是车辆和燃料用途。 vehicle和fuel_use都有一个registration_number列。我的触发器确保在车辆中引用registration_number的fuel_use中有条目时,我无法更新车辆中的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

但这不起作用。事实上,抛出了异常。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

尝试:

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;");

看看是否有效。