2012-05-23 10 views
13

mam "dzień" tabela tworzona następującoograniczenie klucza obcego ON DELETE CASCADE nie pracuje w sqlite bazy na 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)"; 

i mam utworów tabeli utworzonej następująco

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

jak pokazano powyżej Mam klucz objaśniający day_id odnoszące się do day_id dni w tabeli ...

Tak więc chcę, aby usunąć dzień, a następnie usunąć odpowiedni ślad ... Ale tak się nie dzieje w moim przypadku.

Mam SQLite w wersji 3.5.9

A także Dodałem 1 linię w mojej klasie pomocnika jak

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

ale nadal nie będzie działać .. proszę mi pomóc ..

+0

ale jak już powiedziałem, dodałem linię "PRAGMA foreign_keys = ON;" w mojej klasie pomocy sqlite – NullPointerException

Odpowiedz

9

Kaskadowe usuwanie nie jest obsługiwane do wersji Sqlite w wersji 3.6.19, która jest po raz pierwszy dołączana do systemu Android 2.2.

Na szczęście istnieje alternatywa.

można wykonać kolejne zapytanie jak to poniżej tworzyć kwerendy tabeli:

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

Zauważ, że delete_days_with_track jest tylko nazwa opisowy, co robi spust, a to jest właśnie wzór używam; Wierzę, że możesz nazwać to, co chcesz.

+4

To nie działa dla mnie. Muszę użyć (WHERE OLD.day_id = days.day_id), aby działało. Spędziłem dużo czasu, dopóki go nie wydałem. Po więcej informacji. http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers –

+0

Zabawny. Mam tu 3.7.9 na maszynie Ubuntu 12.04, a NA KASKU CASE DELETE też nie działa. O dziwo, spust nie działa: przetłumaczony na podany przykład, twierdzi "Błąd: nie ma takiej kolumny: track.day_id" - chociaż "WYBIERZ * OD DNI UMÓW ŚCIEŻKI NA track.day_id = days.day_id" działa poprawnie. Jestem zmieszany. – Izzy

1

Według wsparciu SQLite Documentation dla kluczy obcych nie dodano aż 3.6.19.

Za pomocą 3.5.9 będziesz musiał wykonać swoje usuwanie kaskadowo w inny sposób.

+0

Czy jest jakiś sposób na uaktualnienie wersji sqlite lub w inny sposób? ponieważ muszę obsługiwać moją aplikację na Androida w wersji 2.1 i późniejszej – NullPointerException

+0

Nie trzeba wykonywać ręcznych operacji usuwania, patrz zapytanie o wyzwalacz poniżej. – jkschneider

+0

@jkschneider, Ah, dzięki! Używam SQLite, ale nie twierdzę, że jestem ekspertem. Dzięki za nauczenie mnie czegoś nowego. – Barak

Powiązane problemy