Android中使用SQLite的外键约束? 删除级联

我有两个表:轨道和航点,一个轨道可以有许多航点,但一个航点只分配到一个轨道。

在方式点表我有一个名为“trackidfk”列插入track_ID一旦一个轨道,但是我没有设置这个列的外键约束。

当我删除一个轨道,我想删除指定的航点,这是可能的吗? 我读了关于使用触发器,但我不认为他们在Android支持。

要创build航点表:

public void onCreate(SQLiteDatabase db) { db.execSQL( "CREATE TABLE " + TABLE_NAME + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + LONGITUDE + " INTEGER," + LATITUDE + " INTEGER," + TIME + " INTEGER," + TRACK_ID_FK + " INTEGER" + " );" ); ... } 

支持删除级联的外键约束,但您需要启用它们。
我只是把以下内容添加到我的SQLOpenHelper ,这似乎是伎俩。

 @Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); if (!db.isReadOnly()) { // Enable foreign key constraints db.execSQL("PRAGMA foreign_keys=ON;"); } } 

我宣布我的引用列如下。

 mailbox_id INTEGER REFERENCES mailboxes ON DELETE CASCADE 

由于Android 4.1(API 16) SQLiteDatabase支持:

 public void setForeignKeyConstraintsEnabled (boolean enable) 

正如e.shishkin的post所说,从API 16起,应该使用db.setForeignKeyConstraintsEnabled(boolean)SqLiteOpenHelper.onConfigure(SqLiteDatabase)方法中启用外键约束,

 @Override public void onConfigure(SQLiteDatabase db){ db.setForeignKeyConstraintsEnabled(true); } 

不pipe@phil提到的是好的。 但是您可以使用数据库自​​身的另一种默认方法来设置外键。 那是setForeignKeyConstraintsEnabled(true)。

 @Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); if (!db.isReadOnly()) { // Enable foreign key constraints db.execSQL("PRAGMA foreign_keys=ON;"); //(OR) db.setForeignKeyConstraintsEnabled (true) } } 

对于Docs,请参阅SQLiteDatabase.setForeignKeyConstraintsEnabled

不要太老的问题来回答一个更完整的答案。

 @Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); if (!db.isReadOnly()) { setForeignKeyConstraintsEnabled(db); } mOpenHelperCallbacks.onOpen(mContext, db); } private void setForeignKeyConstraintsEnabled(SQLiteDatabase db) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { setForeignKeyConstraintsEnabledPreJellyBean(db); } else { setForeignKeyConstraintsEnabledPostJellyBean(db); } } private void setForeignKeyConstraintsEnabledPreJellyBean(SQLiteDatabase db) { db.execSQL("PRAGMA foreign_keys=ON;"); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void setForeignKeyConstraintsEnabledPostJellyBean(SQLiteDatabase db) { db.setForeignKeyConstraintsEnabled(true); } 

我不认为SQLite支持这个开箱即用。 我在我的应用程序中做的是:

  1. 创build交易
  2. 删除详细数据(在你的例子中的航点)
  3. 删除主数据(在你的例子中的轨道)
  4. 提交成功交易

这样,我确信所有的数据都被删除或没有。

Android支持触发器,sqlite不支持这种types的级联删除。 在这里可以find一个在android上使用触发器的例子。 尽pipe如Thorsten所说的使用交易可能就像触发器一样容易。

Android 1.6中的SQLite版本是3.5.9,所以它不支持外键…

http://www.sqlite.org/foreignkeys.html “本文档描述了对SQLite 3.6.19版中引入的SQL外键约束的支持。”

在Froyo它的SQLite版本3.6.22,所以…

编辑:看到sqlite版本:亚行shell程序sqlite3 – 版本

Android 2.2及更高版本的SQLite支持具有“on delete cascade”的外键。 但是在使用它们的时候要小心:有时在一列上触发一个外键时报告错误,但是真正的问题在于子表中的另一列外键约束或者其他表引用这个表。

看起来像SQLite检查所有约束时,启动其中之一。 它实际上是在文档中提到的。 DDL与DML约束检查。