2011-05-15 86 views
1

1st TableAndroid Sqlite觸發器操作經過

這是我的第一張表,它有3列,全部由用戶輸入。沒有併發症,它工作正常。但是還有另外一張表,它依賴於這張表格的第3列。即房間號碼欄。請忽略名稱約定,因爲我沒有真正遵守任何命名約定。

second table

這是我的第二個表,你可以看到它有它的最後一列的房號。請忽略名稱約定。這個房間號碼列是外鍵它依賴於第一個表項或刪除 現在我已經爲第二個表創建了一個模式。它聲明它有5列,最後一個是外鍵。

private static final String DATABASE_CREATE_NOTES_ID_TABLE = 
    ("CREATE TABLE "+ DATABASE_NOTES_TABLE +" ("+ KEY_ROWID +" INTEGER PRIMARY KEY AUTOINCREMENT, "+ 
      KEY_TIME + " TEXT, "+ 
      KEY_NOTES + " TEXT, "+ 
      KEY_DATE + " TEXT, " + 
      KEY_ROOMS + " INTEGER , FOREIGN KEY (" + KEY_ROOMS + ") REFERENCES " + DATABASE_PATIENT_TABLE +" (" +KEY_ROOM_NUMBER+ "));"); 

您看到的表正在成功創建。 現在,我必須編寫一個TRIGGER語句,基於此,當我從第一個表中刪除房間號時,應該刪除第二個表中具有相同房間號的所有行。如果我在第一個表格中添加一個新的房間號碼,那麼它應該被添加到第二個表格中。 爲我寫了新的房間號碼中插入觸發聲明如下

db.execSQL("CREATE TRIGGER fk_notesTable_roomNumber " + 
       " BEFORE INSERT "+ 
       " ON "+DATABASE_NOTES_TABLE+ 
       " FOR EACH ROW BEGIN"+ 
       " SELECT CASE WHEN ((SELECT "+KEY_ROOM_NUMBER+" FROM "+DATABASE_PATIENT_TABLE+" WHERE "+KEY_ROOM_NUMBER+"=new."+KEY_ROOMS +") IS NULL)"+ 
       " THEN RAISE (ABORT,'Foreign Key Violation') END;"+ 
       " END;"); 

這片我已經在我的數據庫文件中的OnCreate()添加的代碼。我還能做什麼?這裏什麼都沒有發生。 請指出我出錯的地方。 謝謝, Shaista

回答

2

您已添加INSERT觸發器。如果嘗試插入與觸發器中指定的約束不匹配的行,則會引發錯誤;當從另一個表中刪除行時,它不做任何事情。

您需要在第一個表上刪除相應行的AFTER DELETE觸發器。