2012-01-12 16 views
25

मैं एक एंड्रॉइड डेटाबेस एप्लिकेशन विकसित कर रहा हूं। मैं सिर्फ यह जानना चाहता हूं कि कौन सा कोड तेजी से निष्पादित करता है और उनके बीच क्या अंतर है?एंड्रॉइड SQLite: कौन सी क्वेरी ("क्वेरी" या "rawQuery") तेज है?

क्वेरी - 1 =

db.rawQuery("select * from user_table where user_id =" + userId, null); 

क्वेरी - 2 =

db.query(USER_TABLE_NAME, ALL_COLUMNS, "user_id = " + userId, null, null, null, null); 
+0

... इसे आजमाएं और देखें? मैं सभी उद्देश्यों और उद्देश्यों के लिए "वही" अनुमान लगाने जा रहा हूं। लेकिन, * कृपया किसी भी मामले में प्लेसहोल्डर का उपयोग करें *। –

+0

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

उत्तर

15

उपयोग क्वेरी।

एंड्रॉयड precompile प्रश्नों और भी कई अलग अलग कच्चे प्रश्नों का उपयोग कर प्रदर्शन मुद्दा हो सकती है।

उपयोग rawQuery बिल्कुल जरूरत है केवल जब।

इसके अलावा, दोनों अपने उदाहरण SQL इंजेक्शन का एक प्रमुख सुरक्षा समस्या है,।

आप userId स्वच्छ करना चाहिए।

करने के लिए सबसे स्पष्ट बात एंड्रॉयड जाने का उपयोग करके यह कार्य करें:

db.query(USER_TABLE_NAME, ALL_COLUMNS, "user_id = ?", new String[] {userId}, null, null, null); 
+3

आरई प्रीकंपिल्ड प्रश्न: वे केवल तैयार किए गए उपयोग का उपयोग करते समय लागू होते हैं। क्वेरी() बस स्ट्रिंग बनाता है और इसे rawQuery() पर भेजता है। –

+0

खैर, प्रीपेडस्टेटमेंट एक ही क्वेरी को कई बार चलाने के लिए है, लेकिन मुझे लगता है कि ड्राइवर द्वारा किसी प्रकार का अनुकूलन भी किया जाता है। एंड्रॉइड के कई अलग-अलग प्रश्नों का उपयोग करते समय मुझे बहुत सी त्रुटि मिली है, जिसमें बहुत से कथन की शिकायत की गई थी। :) –

+0

@JonAdams कृपया मेरी मदद अपनी टिप्पणी को समझते हैं, 'जब preparedstatement का उपयोग कर ही लागू होते हैं', जहां हम preparedstatement प्रयोग करते हैं, जबकि एक ही rawQuery द्वारा प्राप्त किया जा सकता है? (यानी आप '?' डाल सकते हैं, और तर्क पारित कर सकते हैं?) – Darpan

5

एंड्रॉयड स्रोत में SQLiteDatabase.java को देखते हुए पता चलता है कि क्वेरी (..) QueryBuilder बुला निर्माण करने के लिए समाप्त होता है एक स्ट्रिंग के रूप में क्वेरी करें और फिर यह अनिवार्य रूप से rawQuery() को कॉल करता है। वे मानते हैं कि आपने अपना खुद का बयान बनाने के लिए भी वही काम किया है।

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