2012-05-23 13 views
13

मेरे पास है पर SQLite डेटाबेस में काम नहीं कर रहा "दिन" के रूप में बनाया तालिकाहटाना कैस्केड पर विदेशी कुंजी बाधा एंड्रॉयड

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

इस प्रकार मैं पटरियों टेबल बनाया है मेरे पास टेबल दिनों के दिन_आईडी के संदर्भ में विदेशी कुंजी दिन_आईडी है ...

तो मैं क्या चाहता हूं कि अगर मैं दिन हटा दूं तो संबंधित ट्रैक भी हटाया जाना चाहिए ... लेकिन यह मेरे मामले में नहीं होता है ..

मैं ("ऑन = PRAGMA foreign_keys;") संस्करण के साथ SQLite 3.5.9

और यह भी मैं

के रूप में मेरे सहायक वर्ग में 1 लाइन को शामिल किया है

> db.execSQL है;

लेकिन अभी भी काम नहीं करेगा है .. कृपया मेरी मदद करो बाहर ..

+0

लेकिन जैसा कि मैंने कहा कि मैंने "PRAGMA विदेशी_की = चालू" पंक्ति जोड़ दी है मेरे स्क्लाइट सहायक वर्ग – NullPointerException

उत्तर

9

कैस्केडिंग डिलीट एसक्लाइट संस्करण 3.6.1 9 तक समर्थित नहीं है, जिसे पहले एंड्रॉइड 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 सिर्फ एक नाम क्या ट्रिगर करता है के वर्णनात्मक है, और यह सिर्फ पैटर्न मैं उपयोग है, मेरा मानना ​​है कि आप इसे अपनी इच्छानुसार कुछ भी नाम दे सकते हैं।

+4

यह मेरे लिए काम नहीं कर रहा है। मुझे काम करने के लिए (जहां OLD.day_id = days.day_id) का उपयोग करना है। मैंने इसे जारी किए जाने तक काफी समय बिताया है। अधिक जानकारी के लिए। http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers –

+0

मजेदार। मेरे पास उबंटू 12.04 मशीन पर 3.7.9 है और डिलीट कैस्केड पर या तो काम नहीं करता है। आश्चर्यजनक रूप से, न तो ट्रिगर करता है: दिए गए उदाहरण में अनुवाद किया गया है, यह दावा करता है "त्रुटि: ऐसा कोई कॉलम नहीं: track.day_id" - यद्यपि ट्रैक पर क्लिक करें * ट्रैक * दिन_दिन = दिन .day_id' ठीक काम करता है। मैं उलझन में हूं। – Izzy

1

विदेशी कुंजी के लिए SQLite Documentation समर्थन नहीं जोड़ा गया था 3.6.19 तक के अनुसार।

3.5.9 का उपयोग करके आपको किसी अन्य तरीके से अपना कैस्केड हटाना होगा।

+0

में एसक्लाइट संस्करण या किसी अन्य तरीके को अपग्रेड करने का कोई तरीका है ?? क्योंकि मुझे एंड्रॉइड संस्करण 2.1 पर मेरे ऐप का समर्थन करना है – NullPointerException

+0

आपको मैन्युअल रूप से हटाना नहीं है, नीचे ट्रिगर क्वेरी देखें। – jkschneider

+0

@jkschneider, आह, धन्यवाद! मैं SQLite का उपयोग करता हूं, लेकिन मैं एक विशेषज्ञ होने का कोई दावा नहीं करता हूं। मुझे कुछ नया सिखाने के लिए धन्यवाद। – Barak

संबंधित मुद्दे