2012-03-05 69 views
1

我有一個非常簡單的鏈接表中設置了,我需要從所有3個表中刪除行我應該如何使用Android去除SQLite中的鏈接行?

表1 - 轉讓{assignment_id}

LinkTable - AssignmentTasks {assignment_id,TASK_ID}

表2 - 任務{task_id}

我可以輕鬆地從Assignment和AssignmentTasks中刪除,因爲我擁有Id但我沒有與此任務相關的任務列表。

我已經構建了一個遊標,它返回與賦值有關的所有task_ids,但我無法刪除它們,而鏈接表中的記錄引用它們。 (我不認爲我可以,因爲外鍵約束應該會阻止我刪除其他地方引用的行)

是否需要存儲task_ids列表,刪除assignment_tasks記錄,刪除分配記錄,然後遍歷存儲列表的task_ids和刪除每個任務?還是有更好的方法來做到這一點?

回答

1

或者你也可以把外鍵約束暫時關閉檢查:

pragma foreign_keys = off; 

但是這不應該是必要的。

這裏的另一個問題是,這是目前寫成一個多對多的關係。這意味着多項任務可能涉及一項任務。只是因爲引用它的任務之一被刪除,刪除任務可能不會好。相反,在刪除它之前,您需要檢查該任務是否不再被引用。

或者,如果你真的意味着每個任務只屬於一個任務,你可以設置你的架構像這樣:

CREATE TABLE Assignment (assignment_id int PRIMARY KEY); 
CREATE TABLE Task (
    task_id int PRIMARY KEY, 
    assignment_id int FOREIGN KEY REFERENCES Assignment ON DELETE CASCADE 
); 

ON DELETE CASCADE位將導致任務條目時要刪除的它所指的分配被刪除。這隻有當外鍵約束被啓用時纔有效。如果任務由於觸發器或其他級聯而被刪除,則可能需要啓用遞歸觸發器以及pragma recursive_triggers = on

另一種可能性(如果要保留原始模式)是使AssignmentTask表中的外鍵引用執行級聯刪除。這樣,刪除任務時,這些行將自動刪除。然後,一旦所有這些都被照顧,您可以刪除作業。

+0

我沒有得到一個多對多的,我只是削減了簡潔的表的詳細信息。我會研究'ON DELETE CASCADE' – Luke 2012-03-05 13:30:28

1

爲什麼不根據您想要刪除的assignment_id查詢task_id。

您可以將相關數據刪除到數據庫,但這取決於您是否在創建關係時定義了級聯動作onDelete。

如果你打算使用級聯onDelete據我所知,你需要在sqlite上啓用它。看到這篇文章如何。 Foreign key constraints in Android using SQLite? on Delete cascade

您可以使用原始查詢。例如

從任務刪除其中TASK_ID中(選擇任務TASK_ID其中assignment_id = your_assignment_id_here)

我也建議使用交易,這兩個原因),所以你可以在情況下回滾或者你的查詢失敗。 b)如果你有多個查詢,sqlite總體上可以更好地處理交易。因此,將所有刪除隊列放置在事務中的給定操作。下面

鏈接是rawQuery: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#rawQuery(java.lang.String,java.lang.String中[])

+0

謝謝,看起來像你們兩個人都建議啓用'ON DELETE CASCADE'我還將着眼於實現事務以試圖更好地處理一個或多個查詢失敗的情況。 – Luke 2012-03-05 13:32:09

相關問題