2012-01-05 10 views
8

ऐसा लगता है कि विदेशी कुंजी की सीमाएं SQLite में संस्करण 3.6.x के बाद समर्थित हैं। IOS5.0 पर SQLite का संस्करण 3.7.7 है (sqlite3.h में मिला है)।एसक्यूएलएइट - विदेशी कुंजी की कमीएं - आईओएस 5

लेकिन जब मैं एक सारणी में एक पंक्ति डालने का प्रयास करता हूं जिसमें बाधा होती है, तो मेरी पंक्ति सही ढंग से डाली जाती है भले ही संबंधित विदेशी कुंजी मौजूद न हो। मुझे कोई त्रुटि नहीं है।

ही डालने बयान एप्लिकेशन का उपयोग कर की तरह Navicat मुझे एक "बाधा उल्लंघन त्रुटि"

आप जानते हैं कि विदेशी कुंजी iOS 5 पर समर्थन कर रहे क्या देता कर?

CREATE TABLE artist(
    artistid INTEGER PRIMARY KEY, 
    artistname TEXT 
) 

CREATE TABLE "track" (
    "trackid" INTEGER PRIMARY KEY AUTOINCREMENT, 
    "trackname" TEXT, 
    "trackartist" INTEGER, 
    CONSTRAINT "trackartist" FOREIGN KEY ("trackartist") REFERENCES "artist" ("artistid") ON DELETE CASCADE ON UPDATE CASCADE) 

सच सरल है, है न:

यहाँ डाटाबेस स्कीमा है?

धन्यवाद एम्मानुएल

+0

: SQLite Doc

और जब आप कनेक्शन खोलने क्या आप उस कोड को पोस्ट कर सकते हैं जहां आप डालने वाले हैं तालिका? – Eric

+0

हाय, मैं एफएमडेटाबेस का उपयोग कर रहा हूं, कोड वास्तव में सरल है: [डीबी executeUpdate: @ "ट्रैक में डालें (ट्रैकनाम, trackartist) मान (?,?)", @ "नया ट्रैक", [NSNumber संख्या WithInt: i ]] – ecaste

+0

अजीब ... मेरे पास बिल्कुल वही परिदृश्य है ... (Navicat, आईओएस, एफएमडीबी)। वही मुद्दा। बहुत प्यार होना चाहिए। – walkingbrad

उत्तर

13

विदेशी कुंजी डिफ़ॉल्ट रूप से अक्षम हैं। आपको प्रत्येक कनेक्शन के लिए उन्हें अलग से सक्षम करना होगा। सेटिंग "चिपचिपा" नहीं है। जब भी आप SQLite डेटाबेस से कनेक्ट होते हैं तो आपको यह करना होगा।

PRAGMA foreign_keys = ON; 

बाधाएं अच्छी हैं कि Navicat आपके लिए इसका ख्याल रखता है। अपने कोड में, यह आपका काम है।

+0

यह बहुत अच्छा है लेकिन मैं यह कैसे कर सकता हूं? क्या मैं इसे डीबी में निष्पादित करता हूं? मैं कोड की इस 'PRAGMA विदेशी_की = ओएन' लाइन का उपयोग कैसे करूं? – Daniel

+0

@Daniel: हाँ, आप निष्पादित करते हैं जैसे कि यह एक SQL कथन था। [SQLite के सी इंटरफ़ेस पर विवरण] (http://www.sqlite.org/c3ref/prepare।एचटीएमएल) –

+0

धन्यवाद, इसे मिला और अब काम कर रहा है। चियर्स – Daniel

4

मुझे अंत में समाधान मिला है .... और कैटकॉल आप सही थे।

डिफ़ॉल्ट रूप से sqlite डेटाबेस विदेशी कुंजी विकल्प अक्षम के साथ खोला जाता है, भले ही टेबल विदेशी कुंजी बाधाओं के साथ बनाया गया हो!

तो बस इस सरल अनुरोध करना:

PRAGMA foreign_keys=ON; 

सिर्फ डेटाबेस खोलने, और लेन-देन के बाहर

आशा इस किसी और में मदद मिलेगी (यदि आप fmdatabase और लेन-देन कार्यक्षमता का उपयोग कर रहे हैं) के बाद।

एम्मानुएल

2

यह मैं इसे FMDB का उपयोग कर कैसे करना है:

[database executeUpdate:@"PRAGMA foreign_keys=ON"]; 
0

यह दस्तावेज़ पर है:

[database executeUpdate:@"PRAGMA foreign_keys=ON"]; 
संबंधित मुद्दे