2012-05-23 8 views
13

ho "giorni" tabella creata come seguevincolo di chiave esterna ON DELETE CASCADE non funziona nel database SQLite su 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)"; 

e ho tracce tabella creata come segue

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

come indicato sopra ho la chiave straniera day_id che fa riferimento al giorno_id dei giorni di tavolo ...

Quindi quello che voglio è se cancelli il giorno, allora la traccia corrispondente dovrebbe anche essere cancellata ... Ma non succede nel mio caso ..

ho SQLite con la versione 3.5.9

E inoltre ho aggiunto 1 riga nella mia classe di supporto come

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

ma è ancora non funziona .. please help me out ..

+0

ma come ho detto ho aggiunto la riga "PRAGMA foreign_keys = ON;" nella mia classe helper sqlite – NullPointerException

risposta

9

L'eliminazione a cascata non è supportata fino alla versione 3.6.19 di Sqlite, che è inclusa per la prima volta su Android 2.2.

Fortunatamente esiste un'alternativa.

È possibile eseguire un'altra query come questa qui sotto la tua creare query di tabella:

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

noti che delete_days_with_track è solo un nome descrittivo di ciò che il grilletto fa, e questo è proprio il modello che uso; Credo che potresti nominarlo tutto ciò che desideri.

+4

Questo non funziona per me. Devo usare (WHERE OLD.day_id = days.day_id) per farlo funzionare. Ho passato molto tempo fino a quando l'ho rilasciato. Per maggiori informazioni. http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers –

+0

Divertente. Ho 3.7.9 qui su una macchina Ubuntu 12.04 e ON DELETE CASCADE non funziona neanche. Stranamente, nemmeno il trigger: tradotto nell'esempio fornito, afferma "Errore: nessuna colonna: track.day_id" - anche se un "SELECT * FROM track JOIN days ON track.day_id = days.day_id' funziona correttamente. Non ho capito bene. – Izzy

1

Secondo il SQLite Documentation supporto per chiavi esterne non è stato aggiunto fino 3.6.19.

Utilizzando la versione 3.5.9 è necessario eseguire le eliminazioni a cascata in qualche altro modo.

+0

Quindi c'è un modo per aggiornare la versione sqlite o in qualsiasi altro modo ?? perché devo supportare la mia app su Android versione 2.1 in poi – NullPointerException

+0

Non devi eliminare manualmente, vedi la query di trigger qui sotto. – jkschneider

+0

@jkschneider, Ah, grazie! Uso SQLite, ma non pretendo di essere un esperto. Grazie per avermi insegnato qualcosa di nuovo. – Barak

Problemi correlati