2012-11-30 14 views
25

एंड्रॉइड 4.2 में, SQLite 3.7.11 का उपयोग करते हुए, जब मैं क्विज़ तालिका से एक पंक्ति हटाता हूं, जो स्कीमा नीचे है, क्विज़ क्वेस्टेशन तालिका में संबंधित पंक्तियां हटाई नहीं जाती हैं।SQLite हटाएं कैस्केड काम नहीं कर रहा

मैं यह नहीं समझ सकता कि क्या गलत है। मैंने

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

बनाने तालिका विवरणों के पहले और बाद में डालने का प्रयास किया है।

बनाएं तालिका बयान:

CREATE TABLE quizzes(quiz_name TEXT PRIMARY KEY COLLATE NOCASE); 

CREATE TABLE quizQuestions(quiz_name TEXT, question_id INTEGER, 
    PRIMARY KEY(quiz_name, question_id), 
    FOREIGN KEY(quiz_name) REFERENCES quizzes(quiz_name) ON DELETE CASCADE, 
    FOREIGN KEY(question_id) REFERENCES questions(question_id) ON DELETE CASCADE); 
+0

क्या कोई त्रुटि संदेश है? यह ध्यान देने के अलावा कि यह काम नहीं कर रहा है ... – bonCodigo

+0

नहीं, LogCat में कुछ भी नहीं दिखाता है। – Dan14021

+0

शायद यह तथ्य यह है कि आपके प्राथमिक कुंजी एक यौगिक कुंजी .... कुछ इस तरह शायद .: प्राथमिक कुंजी (quiz_name, question_id) संघर्ष पर ध्यान न दें, बाधा "PrimaryKey" है की वजह से है विदेशी कुंजी ("quiz_name", "question_id") संदर्भ "quizQuestions" ("quiz_name", "question_id") हटाए गए कैस्केड पर); – bonCodigo

उत्तर

46

कोई व्यक्ति quizQuestions से quizzes या questions से हटाए जाने पर पंक्तियों को हटा देना चाहिए। अगर विदेशी कुंजी समर्थन बंद हो जाता है तो यह संपूर्ण विदेशी कुंजी बाधा को अनदेखा कर देगा और आपके पास केवल नियमित कॉलम हैं जिनमें कोई मूल्य हो सकता है।

SQLite PRAGMA foreign_keys = OFF पर डिफ़ॉल्ट रूप से डेटाबेस डेटाबेस खोलता है। यह किसी तालिका या स्कीमा की संपत्ति नहीं है।

यदि आप SQLiteOpenHelper का उपयोग करते हैं तो इसे onOpen पर रखें। यही वह स्थान है जिसे हर बार डेटाबेस खोला जाता है। onCreate डेटाबेस बनने के बाद केवल एक बार।


क्या SQLiteOpenHelper कॉल जब आप पहली बार के लिए getWriteableDatabase फोन

  1. onConfigure हर बार, एपीआई स्तर> = 16 आवश्यक
  2. है अस्तित्व और डेटाबेस फ़ाइल का संस्करण निम्न पर निर्भर करता है एक लेनदेन
    • onCreate में कोई डेटाबेस फ़ाइल नहीं है, तो एक लेनदेन के भीतर कहा जाता है। आम तौर पर, यह ऐप के पूरे जीवनकाल में केवल एक बार होता है।
    • onUpgrade यदि डेटाबेस संस्करण (PRAGMA user_version - डेटाबेस फ़ाइल के अंदर सहेजा गया) तो SQLiteOpenHelper के निर्माता में प्रदान किए गए संस्करण से कम है। हर बार जब आप अपने कोड में संस्करण को टक्कर देते हैं तो होता है।
    • फ़ाइल मौजूद नहीं है और संस्करण मिलान होने पर कुछ भी नहीं।
  3. onOpen हर बार

SQLiteOpenHelper का एक ही उदाहरण पहले से ही एक खुले डेटाबेस है, तो यह सिर्फ यह और ऊपर होता है की कुछ भी नहीं वापस आ जाएगी।

+0

धन्यवाद, मेरा मानना ​​है कि यह समस्या थी, कि जब भी मैं डेटाबेस खोलता हूं, मैं केवल क्रोएट में विदेशी_की नहीं बदल रहा था। – Dan14021

20

अपने Android एप्लिकेशन में डेटाबेस खोलने के बाद यह सही जोड़ने का प्रयास करें:

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

यह विदेशी कुंजी के लिए समर्थन है, जो आवश्यक है ON DELETE CASCADE ठीक से काम करने के लिए चालू हो जाती है ।

+0

हां, मैं ऐसा कर रहा हूं लेकिन यह अभी भी हटा नहीं रहा है।
उदाहरण के लिए , 'db.rawQuery (" क्विज़ (quiz_name) मूल्यों ('Test1') में डालने ", नल),'
'db.rawQuery (" सवाल में डालने (सवाल) मूल्यों ('Question1 ') ", नल),'
'db.rawQuery (" quizQuestions में डालने (quiz_name, question_id) मूल्यों (' Test1 ', 1) ", नल),'
'db.rawQuery (" से हटाएँ प्रश्नोत्तरी जहां quiz_name = 'test1' ", शून्य);'
प्रश्नोत्तरी तालिका में test1 पंक्ति छोड़ देता है। – Dan14021

+2

ऐसा लगता है कि एपीआई 16 से शुरू होता है (जो आपको मिला है) आपको इसे कॉन्फ़िगर करना चाहिए() http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onConfigure%28android .database.sqlite.SQLiteDatabase% 29 – mvp

+2

और ['db.setForeignKeyConstraintsEnabled (true)'] का उपयोग करें (http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#setForeignKeyConstraintsEnabled%28boolean%29) - लेकिन बड़ा अंतर यह है: 'ऑन कॉन्फिगर' 'ऑनक्रेट '/' अपडेटेट' से पहले होता है, इसलिए आपके पास पहले से ही बाधाएं सक्षम हैं। जैसे एक टेबल छोड़ने से कैस्केडिंग डिलीट ट्रिगर हो जाएंगे जो शायद आपके इरादे से नहीं है। – zapl

0

मुझे दृश्य मूल पर एक ही समस्या थी !!! आपको इस तरह के कमांड टेक्स्ट को लिखना होगा:

शंकु।कमांडटेक्स्ट = "PRAGMA विदेशी_की = चालू; कर्मचारियों से हटाएं जहां cod_emp = 0;"

और आप इसे हर आप कुछ को नष्ट करना है

6

SQLite अक्षम विदेशी कुंजी डिफ़ॉल्ट रूप से विवश है, तो आप बस OnOpen की तरह अपने DBhelper कक्षा में विधि ओवरराइड द्वारा इसे सक्षम करना

नीचे
public class YourOwnDbHelper extends SQLiteOpenHelper { 
    @Override 
    public void onOpen(SQLiteDatabase db){ 
     super.onOpen(db); 
     db.execSQL("PRAGMA foreign_keys=ON"); 
    } 
} 
+0

यह SQLiteAssetHelper के लिए भी काम करता है। धन्यवाद! – Rm558

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