2011-03-25 15 views

उत्तर

41

आप कॉमन्स-लैंग उपयोगिता का उपयोग कर सकते हैं या आप इसे संभालने के लिए regexp का उपयोग कर सकते हैं।

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

सिर्फ एक गतिशील एसक्यूएल का उपयोग स्ट्रिंग संयोजन का उपयोग करके बनाया:

String value = "one's self"; 
value= DatabaseUtils.sqlEscapeString(value); 
StringBuilder query= new StringBuilder(); 
query.append("insert into tname(foo) values (").append(value).append(")"); 
... execute call with query.toString() ... 

आदर्श रूप में

String value = "one's self"; 
StringBuilder query= new StringBuilder(); 
query.append("insert into tname(foo) values (").append(value).append(")"); 
... execute call with query.toString() ... 

बदलें कि

करने के लिए, एक तैयार बयान

String value = "one's self"; 
StringBuilder query= StringBuilder(); 
query.append("insert into tname(foo) values (?)"); 
SQLiteStatement stmt= db.compileStatement(query.toString()); 
stmt.bindString(1, value); 
long rowId= stmt.executeInsert(); 
// do logic check for > -1 on success 

इस तरह आप उपयोग नहीं करते "एसक्यूएल इंजेक्शन हमलों" में भाग लें।

अधिक जानकारी के लिए http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html का संदर्भ लें।

संपादित मैं एक छोटे से अधिक खुदाई किया था, आप DatabaseUtils.sqlEscapeString(String) का उपयोग एक स्ट्रिंग की सामग्री से बचने के लिए इतना है कि यह एक पूर्ण SQL विवरण के साथ कोई तैयार करता है के लिए मान्य है सकते हैं।

+0

हाय डेव मेरे मान गतिशील रूप से आ रहे हैं – mohan

+2

@मोहन निश्चित रूप से उस उत्तर को देखें जो मैंने विशेष रूप से डेटाबेसUtils.sqlEscapeString (स्ट्रिंग) विधि के साथ पोस्ट किया है। यह आपके इनपुट को "sanitize" करेगा जिससे आप स्ट्रिंग में मान को जोड़ सकें। मैं गतिशील मूल्य को कवर करने के लिए अपना उत्तर संपादित करूंगा। –

+0

'DatabaseUtils.sqlEscapeString() 'के लिए धन्यवाद, यह समाधान बहुत अच्छा काम करता है! –

0

इन एक सरल \ के साथ नहीं किया कर रहे हैं दे सकते हैं एंड्रॉयड में SQLite में एकल उद्धरण की तरह चरित्र को बदलने के लिए? तो, आपका एकल उद्धरण \ 'होगा।

+1

यदि उपयोगकर्ता स्ट्रिंग को संयोजित कर रहा है तो उन्हें 'टू' 'को दोगुना करना होगा, इसलिए यदि यह "तालिका (foo) मानों (' स्वयं का स्वयं ') में डालें" को "तालिका में सम्मिलित करने की आवश्यकता होगी (foo) मान ('एक' का स्वयं ') " –

+0

यह ठीक है, लेकिन मुझे नहीं लगता कि यह एक कम वोट का हकदार क्यों है। मैं ईमानदार था। –

+2

आपके द्वारा प्रदान किए गए भागने एसक्यूएल के लिए मान्य नहीं हैं और समस्या को कम नहीं करते हैं। –

0

असल में, एकल कोट्स (') को दो सिंगल कोट्स (' ') के साथ बदलने का सबसे आसान तरीका है। आपकी क्वेरी तो हो जाएगा:

insert into tname(foo) values ('one''s self'); 

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

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

कृपया ध्यान दें कि:

insert into tname(foo) values ('ones "self"'); 

कि तर्क के आधार पर एक वैध एसक्यूएल बयान है, और कोई अतिरिक्त एस्केपिंग की आवश्यकता है।

+0

के बारे में पूछे जाने वाले विशेष उपयोग मामले में लागू होगा या नहीं, SQL-92 मानक निर्दिष्ट करता है कि एकल-उद्धृत तार <वर्ण स्ट्रिंग अक्षर> और डबल-उद्धृत तार हैं। यदि आप spec के माध्यम से पता लगाते हैं, तो यह कहीं भी नहीं कहता है कि <वर्ण स्ट्रिंग अक्षर> के रूप में उपयोग किया जा सकता है। वास्तव में, एमएसएसक्यूएल डबल उद्धृत तारों को स्वीकार नहीं करता है जहां एक वर्ण स्ट्रिंग अक्षर की आवश्यकता होती है। उदाहरण के लिए, ग्राहक से चुनें * नाम = "PapaSloth"; MSSQL में एक त्रुटि का कारण बन जाएगा। – PapaSloth

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