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

2022-08-31 11:11:49

我有两个表:航迹和航点,一个航迹可以有很多航点,但一个航点只分配给1个航迹。

在点表中,我有一个名为“trackidfk”的列,一旦创建轨道,它就会插入track_ID,但是我没有在此列上设置外键约束。

当我删除航迹时,我想删除分配的航点,这可能吗?我读到了关于使用触发器的信息,但我认为它们在Android中不受支持。

要创建航点表:

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

    ...
}

答案 1

支持具有删除级联的外键约束,但您需要启用它们。
我刚刚在我的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

答案 2

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

public void setForeignKeyConstraintsEnabled (boolean enable)

推荐