2010-09-18 15 views
6

मैं एंड्रॉइड एप्लिकेशन में एक टेबल पर एक विदेशी कुंजी कॉन्स्टिंट को मजबूर करना चाहता हूं।एंड्रॉइड में SQLite ट्रिगर्स?

मैं खोज की है कि इस ट्रिगर्स का उपयोग करके किया जा सकता है:

मैं इसे इस तरह से किया था:

db.execSQL("CREATE TRIGGER dept_id_trigger22+" + 
       " AFTER INSERT "+ 
       " OF EmployeeName ON Employees"+ 
       " BEGIN"+ 
            //Condition 
       " RAISE(ABORT,'error') END;"); 

लेकिन कोई त्रुटि मिली और अवैध मूल्यों डाला जाता है।

इसमें क्या गलत है?

+0

मैं यहाँ कोड की जरूरत नहीं है, लेकिन एक बुनियादी ट्रिगर SQLite पर मेरे लिए काम किया है और (मेरी इकाई परीक्षण के अनुसार) यह सभी एंड्रॉइड संस्करणों पर काम किया। –

+0

क्या आपको लगता है कि मेरा कोड सही है या कुछ गुम है? –

+0

कोई भी एंड्रॉइड में कार्यान्वयन उदाहरण के साथ ट्रिगर सिंटैक्स की तलाश में है। http://www.coderconsole.com/2015/02/android-sqlite-trigger-demo.html – nitesh

उत्तर

6

ठीक है, मैं यह

एंड्रॉयड SQLite चलाता का समर्थन करता है मिला है।

सही सिंटैक्स

db.execSQL("CREATE TRIGGER dept_id_trigger22" + 
       " AFTER INSERT "+ 
       "ON Employees"+ 
       " BEGIN"+ 
            //Condition 
       " SELECT RAISE(ABORT,'error'); END;"); 

मैं उठाने के बयान के बाद अर्धविराम जोड़ने के लिए भूल गया है।

यह कथन निष्पादित नहीं करता है लेकिन यह अपवाद नहीं फेंकता है। अभी भी अपवाद फेंक

धन्यवाद

0

मुझे पता चला कि SQLite संस्करण का उपयोग विदेशी कुंजी का समर्थन नहीं करता है - इसलिए मुझे उम्मीद है कि ट्रिगर भी समर्थित नहीं हैं।

+0

आपकी मदद के लिए धन्यवाद, लेकिन क्या आप मुझे इस मुद्दे के किसी भी संदर्भ के साथ प्रदान कर सकते हैं –

+0

मेरा मानना ​​है कि आपकी धारणा गलत है क्योंकि यह करता है समर्थन ट्रिगर्स –

+0

ऐसा लगता है। मैंने इसकी खोज की, और जो मैंने पढ़ा उससे मुझे लगता है कि ये सुविधाएं उपलब्ध हैं, लेकिन डिफ़ॉल्ट रूप से सक्रिय नहीं हैं। मुझे अभी तक ट्रिगर्स का उपयोग करने का तरीका नहीं पता है, लेकिन क्लास SQLiteDatabase में एक दिलचस्प तरीका है जिसे MarkTableSyncable (स्ट्रिंग टेबल, स्ट्रिंग विदेशीकी, स्ट्रिंग अपडेटटेबल) कहा जाता है जो शायद आप चाहते हैं: http://developer.android.com/ संदर्भ/एंड्रॉइड/डेटाबेस/एसक्लाइट/SQLiteDatabase.html # markTableSyncable% 28java.lang.String,% 20java.lang.String,% 20java.lang.String% 29 – mreichelt

1

मैं इस उत्तर के लिए किसी भी वोट की उम्मीद नहीं है, बस आपको यह बताने के:

आप किसी अन्य डेटाबेस इस्तेमाल कर सकते हैं उदाहरण के लिए H2 database। अस्वीकरण: मैं एच 2 का मुख्य लेखक हूं।

कुछ नुकसान हैं: कुछ (सभी नहीं) संचालन धीमे होते हैं, उदाहरण के लिए डेटाबेस खोलना और बंद करना। जार फ़ाइल अपेक्षाकृत बड़ी है (लगभग 1 एमबी)। आपको जेडीबीसी एपीआई का उपयोग करना होगा।

लेकिन लाभ यह है: एच 2 ट्रिगर, बाधाओं आदि का उपयोग करने का समर्थन करता है।

+0

धन्यवाद थॉमस मैं इसका उपयोग करने पर विचार करूंगा। –

+0

मुझे शायद जोड़ना चाहिए: मेरे (सीमित) परीक्षण के अनुसार कुछ ऑपरेशन तेजी से होते हैं और कुछ बहुत धीमे होते हैं। मैं उस पर काम कर रहा हूं, और आप उम्मीद कर सकते हैं कि अगले महीने में एंड्रॉइड पर एच 2 के प्रदर्शन में सुधार होगा। मैं एंड्रॉइड एपीआई को भी कार्यान्वित करना चाहता हूं ताकि SQLite से H2 तक स्विच करना आसान हो। –

3

विदेशी कुंजी केवल Froyo (2.2) या नए पर Android पर समर्थित हैं, पिछले संस्करणों के लिए आप शामिल कर सकते हैं उनके लिए खोज करेंगे, लेकिन SQLite उन्हें ध्यान नहीं देता। SQLite समर्थन के सभी एंड्रॉइड संस्करण समान प्रभाव उत्पन्न करने के लिए ट्रिगर करते हैं।

SQLite के नए संस्करण (आपके पीसी के लिए) में "genfkey" नामक एक कमांड है जो आपके SQLite डेटाबेस (जिसमें इसमें विदेशी कुंजी है) का विश्लेषण करेगा और समकक्ष ट्रिगर्स का उत्पादन करेगा। ओएस के सभी संस्करणों का समर्थन करते समय आप अपनी तालिकाओं को विदेशी कुंजी बाधाओं के साथ डिज़ाइन कर सकते हैं।

Windows पर, पैरामीटर के रूप में अपने डेटाबेस फ़ाइल के साथ SQLite कमांड लाइन टूल खोलें:

sqlite3 mydatabase.db 
.genfkey --exec 

यह आपके कुंजी बाधाओं के सभी के लिए ट्रिगर उत्पन्न होगा।

1

अंतिम 50 पंक्तियों को हटाने के लिए जब गिनती 100 से अधिक

sqliteDB.execSQL("CREATE TRIGGER IF NOT EXISTS delete_trigger 
    AFTER INSERT ON table1 
    WHEN (SELECT COUNT(*) FROM table1) > 50 " + 
    BEGIN 
     delete From table1 where id not in(select id from table1 order by id desc limit 100; 
    END;" 
); 
संबंधित मुद्दे