Android SQLite при запуске триггера - PullRequest
0 голосов
/ 25 мая 2011

У меня небольшие проблемы с SQLite в Android. Поскольку мое приложение поддерживает Android 1.6, я не могу использовать внешние ключи, поэтому написал триггеры для обеспечения соблюдения этих ограничений.

Мои две таблицы - Vehicle и fuel_use. У транспортного средства и fuel_use есть столбец registration_number. Мой триггер гарантирует, что я не могу обновить регистрационный номер в транспортном средстве при наличии записей в fuel_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;");

Это прекрасно работает, так как останавливает обновления, которые оставляют строки fuel_use, ссылающиеся на несуществующие строки транспортного средства. Однако я только что обнаружил проблему - когда я пытаюсь обновить другой столбец в транспортном средстве - initial_m Пробег - этот триггер отключает его и вызывает откат. Я понимаю, почему это происходит, но не знаю, как переписать триггер, поэтому только обновления в столбце registration_number вызывают откат. Я пробовал:

BEFORE UPDATE ON " + VEHICLE_TABLE_NAME + "." + REGISTRATION_NO_COLUMN

но это не сработало. На самом деле было выброшено исключение.

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 25 мая 2011

Попробуйте:

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

Проверьте, работает ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...