2012-05-23 45 views
13

Tôi có "ngày" bảng được tạo như sauràng buộc khoá ngoại ON DELETE CASCADE không làm việc trong cơ sở dữ liệu SQLite trên 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)"; 

và tôi có theo dõi bảng được tạo như sau

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

như trình bày ở trên tôi có day_id chìa khóa nước ngoài tham chiếu đến day_id của ngày bảng ...

Vì vậy, những gì tôi muốn là nếu tôi xóa ngày sau đó theo dõi tương ứng cũng sẽ bị xóa ... Nhưng nó không xảy ra trong trường hợp của tôi ..

Tôi có sqlite với phiên bản 3.5.9

Và tôi cũng đã thêm 1 dòng trong lớp helper của tôi như

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

nhưng vẫn sẽ không hoạt động .. hãy giúp tôi ra ..

+0

nhưng như tôi đã nói tôi đã thêm dòng "PRAGMA foreign_keys = ON;" trong lớp trợ giúp sqlite của tôi – NullPointerException

Trả lời

9

Xóa tầng không được hỗ trợ cho đến khi Sqlite phiên bản 3.6.19, được đưa vào Android 2.2 lần đầu tiên.

May mắn thay có một giải pháp thay thế.

Bạn có thể thực hiện truy vấn khác như thế này dưới đây của bạn truy vấn bảng tạo:

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

Lưu ý rằng delete_days_with_track chỉ là một tên mô tả về những gì cò làm, và đây chỉ là mô hình tôi sử dụng; Tôi tin rằng bạn có thể đặt tên cho nó bất cứ điều gì bạn muốn.

+4

Điều này không làm việc cho tôi. Tôi đã sử dụng (WHERE OLD.day_id = days.day_id) để làm cho nó hoạt động. Tôi đã dành rất nhiều thời gian cho đến khi tôi phát hành nó. Để biết thêm thông tin. http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers –

+0

Vui nhộn. Tôi có 3.7.9 ở đây trên một máy tính Ubuntu 12.04 và ON DELETE CASCADE không hoạt động. Kỳ lạ, không kích hoạt: dịch sang ví dụ đã cho, nó tuyên bố "Lỗi: không có cột như vậy: track.day_id" - mặc dù một ca khúc 'SELECT * FROM JOIN ngày ON track.day_id = days.day_id' hoạt động tốt. Tôi bối rối. – Izzy

1

Theo sự ủng hộ SQLite Documentation Ngoại phím không được thêm vào cho đến 3.6.19.

Sử dụng 3.5.9 bạn sẽ phải thực hiện việc xóa tầng theo cách khác.

+0

Vì vậy, có cách nào để nâng cấp phiên bản sqlite hoặc bất kỳ cách nào khác không ?? vì tôi phải hỗ trợ ứng dụng của tôi trên phiên bản Android 2.1 trở đi – NullPointerException

+0

Bạn không phải thực hiện xóa theo cách thủ công, hãy xem truy vấn kích hoạt bên dưới. – jkschneider

+0

@jkschneider, Ah, cảm ơn! Tôi sử dụng SQLite, nhưng tôi không tuyên bố là một chuyên gia. Cảm ơn vì đã dạy tôi điều gì đó mới mẻ. – Barak

Các vấn đề liên quan