2012-03-05 31 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

相关问题