2011-05-25 134 views
0

我在Android中遇到了一些SQLite問題。由於我的應用程序支持Android 1.6,因此我無法使用外鍵,所以有寫觸發器來強制實施這些限制。Android SQLite更新觸發器

我的兩張桌子是車輛和fuel_use。車輛和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 

但這沒有奏效。實際上拋出了一個異常。

任何幫助將感激地收到。

回答

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

看看是否能工程。

+0

輝煌 - 它的作品!謝謝。 – barry 2011-05-26 18:04:45

+0

很高興幫助。從未在SQLite中嘗試觸發器,因此看到他們在Android上工作時非常有趣。 – Femi 2011-05-26 18:18:46