ограничение внешнего ключа ON DELETE CASCADE не работает в базе данных sqlite на Android

У меня есть "дни" таблица создана следующим образом

"create table days(" +
            "day_id  integer primary key autoincrement, " +
            "conference_id integer , " +
            "day_date text, " +
            "day_start_time text, " +
            "day_end_time text, " +
            "day_summary text, " +
            "day_description text)";

и у меня есть таблица треков, созданная следующим образом

CREATE_TABLE_TRACK = "create table track(" +
        "track_id integer primary key autoincrement," +
        "day_id integer,"+
        "track_name text," +
        "track_description text," +
        " FOREIGN KEY(day_id) REFERENCES days(day_id) ON DELETE CASCADE )";

как показано выше, у меня есть внешний ключ day_id со ссылкой на day_id таблицы дней ...

Так что я хочу, чтобы, если я удаляю день, соответствующая дорожка также должна быть удалена ... Но в моем случае это не происходит ...

У меня sqlite с версией3.5.9

А также я добавил 1 строку в своем классе помощника как

> db.execSQL("PRAGMA foreign_keys=ON;");

но все еще не работает .. пожалуйста, помогите мне ..

 NullPointerException23 мая 2012 г., 14:03
но, как я уже сказал, я добавил строку "PRAGMA foreign_keys = ON;" в моем классе помощника sqlite

Ответы на вопрос(2)

Решение Вопроса

которая впервые включена в Android 2.2.

К счастью, есть альтернатива.

Вы можете выполнить другой запрос, как этот ниже вашего запроса создания таблицы:

db.execSQL("CREATE TRIGGER delete_days_with track BEFORE DELETE ON track "
       +  "FOR EACH ROW BEGIN"
       +         " DELETE FROM days WHERE track.day_id = days.day_id "
       +  "END;");

Обратите внимание, чтоdelete_days_with_track просто имя, описывающее, что делает триггер, и это просто шаблон, который я использую; Я верю, что вы могли бы назвать это как угодно.

 28 июл. 2016 г., 20:14
Смешной. У меня 3.7.9 здесь, на машине с Ubuntu 12.04, и ON DELETE CASCADE тоже не работает. Странно, но и триггер: переведенный в данный пример, он утверждает: «Ошибка: нет такого столбца: track.day_id» & # X2013; хотяSELECT * FROM track JOIN days ON track.day_id=days.day_id работает отлично. Я в замешательстве.
 20 сент. 2012 г., 14:05
Это не работает для меня. Я использую (WHERE OLD.day_id = days.day_id), чтобы заставить его работать. Я потратил много времени, пока не выпустил его. Для получения дополнительной информации.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers

СогласноДокументация по SQLite поддержка иностранных ключей не была добавлена до 3.6.19.

При использовании 3.5.9 вам придется выполнять каскадные удаления каким-либо другим способом.

 23 мая 2012 г., 14:16
Вам не нужно удалять вручную, см. Запрос триггера ниже.
 23 мая 2012 г., 14:31
@ Барак, я бы хотел сказать, что я был экспертом, но я несколько месяцев делал ручные удаления, прежде чем наткнулся на этот трюк где-то ... О, радость от необходимости убирать код.
 23 мая 2012 г., 14:19
@jkschneider, Ах, спасибо! Я использую SQLite, но не претендую на звание эксперта. Спасибо, что научил меня чему-то новому.
 23 мая 2012 г., 14:23
@Rashmi, см. Ответ jkschneider для решения
 NullPointerException23 мая 2012 г., 14:15
Так есть ли способ обновить версию sqlite или любым другим способом ?? потому что я должен поддерживать мое приложение на Android версии 2.1 года

Ваш ответ на вопрос