Ограничения внешнего ключа в Android с использованием SQLite? на каскаде удаления

У меня есть две таблицы: дорожки и путевые точки, дорожка может иметь много путевых точек, но путевая точка назначается только одной дорожке.

В таблице путевых точек у меня есть столбец «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"
                + " );"
              );

    ...
}
90
задан rgamber 23 March 2014 в 06:08
поделиться

4 ответа

Ограничения внешнего ключа с каскадом удаления поддерживаются, но вам необходимо включить их.
Я только что добавил следующее в свой 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
236
ответ дан 24 November 2019 в 06:54
поделиться

Я не думаю, что SQLite поддерживает это из коробки. В своих приложениях я делаю следующее:

  1. Создание транзакции
  2. Удаление подробных данных (путевые точки в вашем примере)
  3. Удаление основных данных (треки в вашем примере)
  4. Подтверждение транзакции в случае успеха

Это Кстати я уверен, что либо все данные удалены, либо нет.

4
ответ дан 24 November 2019 в 06:54
поделиться

Триггеры поддерживаются Android, и такой тип каскадного удаления не поддерживается sqlite. Пример использования триггеров на android можно найти здесь . Хотя использование транзакций, как заявил Торстен, вероятно, так же просто, как триггер.

4
ответ дан 24 November 2019 в 06:54
поделиться

Версия SQLite в android 1.6 - 3.5.9, поэтому внешние ключи не поддерживаются ...

http://www.sqlite.org/foreignkeys.html «В этом документе описывается поддержка ограничений внешнего ключа SQL, представленных в SQLite версии 3.6.19.»

В Froyo это SQLite версии 3.6.22, так что ...

РЕДАКТИРОВАТЬ: чтобы увидеть версию sqlite: adb shell sqlite3 -version

3
ответ дан 24 November 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: