2011-08-26 10 views
20

मैं डीबग करने का प्रयास करने के घंटों तक संघर्ष कर रहा हूं क्यों निम्नलिखित डिलीट क्वेरी वास्तव में कुछ भी नहीं हटाती है, भले ही सटीक उसी डेटाबेस पर सटीक वही क्वेरी फ़ायरफ़ॉक्स के SQLite प्रबंधक में ठीक काम करे:वास्तव में पंक्तियों को हटाने के लिए डिलीट rawQuery को एक चाल की आवश्यकता क्यों है?

String deleteSql = "DELETE FROM showsummary WHERE url IN (SELECT url FROM showsummary JOIN article_categories USING (url) WHERE categoryid=20 AND title LIKE 'page=%')"; 
mDb.rawQuery(deleteSql, null); 

चूंकि यह है एक जॉइन और एक सब क्वेरी के साथ थोड़ा जटिल, मेरे विचार उप प्रश्नों के बारे में एंड्रॉइड के स्क्लाइट कार्यान्वयन में कुछ सीमाओं के आसपास घूमते थे इसलिए मैंने क्वेरी को सरल बनाने की कोशिश की। लेकिन फिर भी यह कुछ भी नहीं हटाया।

फिर मैंने इसे एक चुनिंदा क्वेरी में बदल दिया (बस SELECT * के साथ हटा दिया गया है) और यह काम करता है। तो शायद यह शामिल होने या उप-प्रश्न नहीं था जो बाद में अपराधी था।

चयन क्वेरी का परीक्षण करने के लिए मैंने लौटा कर्सर में moveToFirst() जोड़ा था:

mDb.rawQuery(deleteSql, null).moveToFirst(); 

जब मैंने बाद में इसे फिर से एक डिलीट क्वेरी में बदल दिया, तो मैं moveToFirst() को हटाने के लिए भूल गया और फिर यह काम किया!

यह अच्छा है कि यह अब काम करता है, लेकिन मैं बहुत उलझन में हूं कि वास्तव में कुछ भी हटाने के लिए कर्सर को स्थानांतरित करना क्यों आवश्यक है। क्या यह डिजाइन द्वारा है या यह एक बग है?

+0

मैंने इस मूर्खता पर ** घंटों पर 4 घंटे की मौत की, उन्हें दस्तावेज़ीकरण में स्पष्ट रूप से बताया जाना चाहिए, समय की बर्बादी क्या है। – LuckyMe

+0

मुझे पसंद है कि आपके प्रश्न में मेरी हटाई गई समस्याओं का उत्तर कितना कुशल है! – Noumenon

+0

इसे खोजने के लिए धन्यवाद। यह निश्चित रूप से दस्तावेज किया जाना चाहिए! ऐसा नहीं होना चाहिए, मुझे लगता है, लेकिन कम से कम यह अब काम करता है। – kgrevehagen

उत्तर

10

मैं क्यों उत्तर नहीं दे सकता है, लेकिन एक और समाधान .execSQL (स्ट्रिंग) का उपयोग करने के पोस्ट के रूप में here

है
5

एक कच्चाQuery परिणाम सेट का कर्सर देता है, जो केवल क्वेरी परिणामों का संदर्भ है। आपको बस सीधे हटाएं() कॉल का उपयोग करना चाहिए। प्रलेखन पर एक नज़र डालें:

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

या एक SQLiteStatement:

http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html

+0

यदि संभव हो तो मैं सीधे हटाए गए प्रश्न का उपयोग करता, लेकिन यह इस तरह के एक जटिल एसक्यूएल कथन का समर्थन नहीं करता है। जहां तक ​​मुझे कम से कम पता है, यह जुड़ने और उप प्रश्नों पर काम नहीं कर सकता है। – marlar

+0

फिर मैंने सुझाए गए दूसरे विकल्प का उपयोग करें। – SBerg413

+0

मैं निश्चित रूप से उस विकल्प को देखूंगा, लेकिन फिर भी मैं उत्सुक हूं कि क्यों चलने की आवश्यकता है। मैंने rawQuery के साथ हटाने के प्रश्नों के कई उदाहरण देखे हैं और उनमें से कोई भी चाल का उपयोग नहीं करता है। – marlar

4

मेरे मामले में, डेली के लिए भी यही बात हुई है, यह "कर्सर.मोव टॉफर्स्ट()" को कॉल करने के बाद सफलतापूर्वक भाग गया। INSERT और अद्यतन क्वेरी के साथ भी यही मामला है। मैंने यह भी देखा है कि ऊपर उल्लिखित प्रश्नों के लिए कर्सर पर किसी भी विधि को कॉल करना मुझे परिणाम सही तरीके से मिला है। कर्सर की किसी भी विधि को कॉल किए बिना वांछित प्रभाव हो रहा है। इसलिए, मुझे लगता है कि आपके प्रश्न का उत्तर यह है: प्रश्न केवल तभी निष्पादित हो जाता है जब हम कर्सर पर कुछ विधि कॉल करते हैं।

3

उत्तर क्यों है क्योंकि कच्चे वास्तव में निष्पादित नहीं होता है जब तक आप कर्सर पर कुछ विधि कॉल नहीं करते हैं। moveToFirst, isAfterLast ..

+0

पुराने उत्तरों से यह अलग कैसे है? आपने अभी @ mopurizwarriors शब्दों की प्रतिलिपि बनाई है। – Androiderson

+0

कृपया ध्यान से फिर से पढ़ें ... यह सफलतापूर्वक चलने के बारे में नहीं है या नहीं। यह बिल्कुल नहीं चल रहा है, लेकिन कर्सर पर कुछ तरीकों से पहले क्वेरी तैयार कर रहे हैं। इसके अतिरिक्त यह जवाब देने की कोशिश/असफल विधि नहीं थी, लेकिन यह कहकर कि इसका काम करना था। – Ewoks

+1

फिर आपको अपने उत्तर पर विस्तृत जानकारी देनी चाहिए, क्योंकि ** क्वेरी केवल तभी निष्पादित होती है जब हम कर्सर पर कुछ विधि कॉल करते हैं ** और ** rawQuery वास्तव में निष्पादित नहीं होता है जब आप वापस कर्सर पर कुछ विधि कॉल करते हैं ** उसी दोस्त को पढ़ें। कोई भी कहेंगे कि आपने अभी कॉपी किया है क्योंकि आपका जवाब 2 साल पुराना है। – Androiderson

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