更新触发器上的Android SQLite

更新触发器上的Android SQLite,android,sqlite,triggers,Android,Sqlite,Triggers,我在Android中使用SQLite时遇到了一些问题。由于我的应用程序支持安卓1.6,我无法使用外键,因此我编写了触发器来强制执行这些约束 我的两张表是车辆和燃油使用。车辆和燃油使用都有一个登记号列。我的触发器可确保在fuel\u use(燃油使用)中有参考车辆中注册号的条目时,我无法更新车辆中的注册号: //on update vehicle db.execSQL("CREATE TRIGGER fk_update_vehicle_trigger_fuel_refere

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

我的两张表是车辆和燃油使用。车辆和燃油使用都有一个登记号列。我的触发器可确保在fuel\u use(燃油使用)中有参考车辆中注册号的条目时,我无法更新车辆中的注册号:

        //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;");
这可以很好地工作,因为它会停止更新,从而使燃油使用行引用不存在的车辆行。然而,我刚刚发现了一个问题——当我尝试更新车辆-初始里程-中的不同列时,此触发器不允许它并强制回滚。我理解为什么会发生这种情况,但不知道如何重写触发器,因此只有注册号列上的更新才会强制回滚。我试过:

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

看看这是否有效。

很乐意帮忙。从来没有在SQLite中尝试过触发器,所以看到它们在Android上工作是相当有趣的。