2012-01-26 10 views
5

मैं आईओएस कोड पोर्ट कर रहा हूं जो एंड्रॉइड ओएस पर पूरी तरह से काम करता है। मैं प्रश्नों का एक गुच्छा निष्पादित करता हूं, प्रश्नों के परिणामों को अस्थायी तालिका में डालता हूं। जब सभी प्रश्न पूर्ण हो जाते हैं तो मैं अस्थायी तालिका से सभी परिणामों को अपने स्वयं के सृजन की वस्तुओं के संग्रह में ले जाता हूं। मैं सीधे संग्रह में चयन करने के बजाय एक अस्थायी तालिका का उपयोग कर रहा हूं क्योंकि मुझे लगता है कि यह अधिक तेज़ी से निष्पादित करता है, या कम से कम यह आईओएस पक्ष पर करता है।SQLiteDatabase.execSQL क्वेरी में INSERT के लिए अपेक्षित काम नहीं कर रहा है

db.execSQL("CREATE TEMPORARY TABLE SearchResults(Name text);"); 
db.execSQL("INSERT INTO SearchResults (Name) SELECT Name FROM ProductNames WHERE NameLower MATCH '" + termLowerCase + "*';"); 
db.execSQL("INSERT INTO SearchResults (Name) SELECT Name FROM BrandNames WHERE NameLower MATCH '" + termLowerCase + "*';"); 

मुझे इस कोड मैं ही कभी पहले execSQL से एक पंक्ति पाने के अमल() दर्ज के साथ फोन: मेरी समस्या यह है कि execSQL() काम नहीं कर रहा जैसा कि मैंने उम्मीद होती है, यहाँ कोड है। मुझे पता है कि उत्पाद नाम तालिका में एक से अधिक परिणाम हैं जो मेरी अवधि से मेल खाते हैं, और मुझे पता है कि ब्रांड नाम तालिका में सैकड़ों पंक्तियां हैं जो मेरी अवधि से मेल खाना चाहिए। यदि मैं इस कोड को बदलता हूं:

Cursor cursor = db.rawQuery("SELECT Name FROM ProductNames WHERE NameLower MATCH '" + termLowerCase + "*'", null); 
cursor.moveToFirst(); 
while (!cursor.isAfterLast()) 
{ 
    resultSet.add(cursor.getString(0)); 
    cursor.moveToNext(); 
} 
cursor.close(); 
cursor = db.rawQuery("SELECT Name FROM BrandNames WHERE NameLower MATCH '" + termLowerCase + "*'", null); 
cursor.moveToFirst(); 
while (!cursor.isAfterLast()) 
{ 
    resultSet.add(cursor.getString(0)); 
    cursor.moveToNext(); 
} 

मुझे उन सभी परिणामों को प्राप्त होता है जिन्हें मैं उम्मीद कर रहा हूं।

क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं? क्या मैं execSQL() को अनुचित तरीके से उपयोग कर रहा हूं? मुझे लगता है कि यह बस क्वेरी को sqlite3_exec() पर पास कर देगा जो मैं आईओएस पर उपयोग करता हूं। अगर मैं execSQL() का उपयोग कर रहा हूं, तो इसकी सीमाएं क्या हैं और मैं क्या करना चाहता हूं सबसे तेज़ विकल्प क्या है? किसी भी मदद के लिए बहुत बहुत धन्यवाद!

उत्तर

0

SQLiteDatabase दस्तावेज़ीकरण के अनुसार आप इस मामले में execSQL का उपयोग नहीं कर सकते हैं। इसके बजाय कच्चेQuery के साथ उस कथन को करने का प्रयास करें।

+0

मेरा मानना ​​है कि दस्तावेज़ीकरण इंगित करता है कि यदि आप क्वेरी से लौटाए गए डेटा की आवश्यकता है तो इसका उपयोग न करें। कच्चेQuery का उपयोग करना मेरे परिदृश्य में व्यवहार्य प्रतीत नहीं होता है, उपर्युक्त कच्चे प्रश्न कोड को मेरे एडीपी 2 पर चलाने के लिए बहुत अधिक समय लगता है। ध्यान दें, मैंने आईओएस संस्करण से आईओएस संस्करण से कुछ अन्य प्रश्नों पर पोर्टिंग का परीक्षण किया है जो एक अलग विधि में है जो FTS3 MATCH का उपयोग करके एक चयन के साथ INSERT INTO का उपयोग करता है और ये ठीक काम कर रहे हैं। यह समस्या एक रहस्य बनी हुई है। –

+0

जिस तरह से मैं प्रलेखन को समझता हूं, वह कहता है कि यह एक कथन चलाएगा जो एक चयन नहीं है। मतलब, INSERT + SELECT उस दस्तावेज़ की बाधाओं का उल्लंघन करता है। जब आप rawQuery का उपयोग करते हैं तो यह काम करता है? धीमे होने पर, उस ऑपरेशन पर विचार करें जो आप अपने डेटा के आकार पर कर रहे हैं। यह एक मामूली ऑपरेशन नहीं है। – jlindenbaum

+0

हां, मैं यहां जो कह रहा हूं वह प्राप्त करता हूं, हालांकि मेरे पास INSERT INTO के साथ execSQL() कॉल और क्वेरी में कथन विवरण हैं। यहां एक उदाहरण दिया गया है जो काम करता है: sql = "SearchResults (SearchOrder, PID, ProductName, DBTable) में प्रवेश करें" + "चयन 3, पी। उत्पादक, पी। नाम, 0" + "सामग्री से I" + "INNER JOIN ProductAltNames A ON (I.IngredientsID = A.IngredientID)" + "INNER JOIN उत्पाद नाम P ON (A.ProductID = P.ProductID)" + "जहां IDcriptionLower MATCH '" + शब्दLowerCase + "*' "; db.execSQL (एसक्यूएल); –