दिलचस्प पोस्ट
त्रुटि: "आईएसएएम को संस्थापित नहीं किया जा सका" अनुसूचित कार्य बनाना एएसपी.नेट स्टेटिक वैरिएबल का जीवनकाल क्या मुझे HTML में मेरे आईएमजी के लिए ऊंचाई और चौड़ाई विशेषताओं को निर्दिष्ट करना चाहिए? जावास्क्रिप्ट क्लाइंट-साइड / कैसे गूगल ने इसे किया था वेबसाइट में स्क्रीनशॉट कैसे करें? (एचडीडी तक पहुंचने की आवश्यकता नहीं है) पायथन में एक उथले सूची को सपाट करना जावास्क्रिप्ट प्रोटोटाइप फ़ंक्शंस में "यह" के संदर्भ को संरक्षित करना विंडो में तत्व की पूर्ण स्थिति प्राप्त करें जावा में "इंस्टॉन्स ऑफ़" का उपयोग प्रत्येक ऑब्जेक्ट के लिए एक जेनेरिक रिपॉजिटरी बनाम विशिष्ट रिपॉजिटरी बनाने का लाभ? वापसी प्रकार द्वारा ओवरलोडिंग यूनिक्स / लिनक्स शैल में मिलान करने के बाद मैं व्युत्क्रम या नकारात्मक वाइल्डकार्ड का उपयोग कैसे कर सकता हूं? एंड्रॉइड में कस्टम डायलॉग बॉक्स कैसे बनाएं? क्या आप सीएसएस के साथ <br /> को लक्षित कर सकते हैं? पाठ फ़ाइल से पहली पंक्ति को पढ़ने के लिए विंडोज बैच कमांड

खंड और प्लेसहोल्डर में

मैं एंड्रॉइड के भीतर निम्न SQL क्वेरी करने का प्रयास कर रहा हूं:

String names = "'name1', 'name2"; // in the code this is dynamically generated String query = "SELECT * FROM table WHERE name IN (?)"; Cursor cursor = mDb.rawQuery(query, new String[]{names}); 

हालांकि, Android सही चिह्नों के साथ प्रश्न चिह्न को प्रतिस्थापित नहीं करता है मैं निम्न कार्य कर सकता हूं, हालांकि, यह एसक्यूएल इंजेक्शन के खिलाफ नहीं है:

  String query = "SELECT * FROM table WHERE name IN (" + names + ")"; Cursor cursor = mDb.rawQuery(query, null); 

मैं इस मुद्दे को कैसे प्राप्त कर सकता हूं और इन खंड का उपयोग करने में सक्षम हूं?

वेब के समाधान से एकत्रित समाधान "खंड और प्लेसहोल्डर में"

फार्म का एक स्ट्रिंग "?, ?, ..., ?" गतिशील रूप से बनाई गई स्ट्रिंग हो सकती है और मूल एसक्यूएल क्वेरी में सुरक्षित रूप से रख सकते हैं (क्योंकि यह एक सीमित प्रपत्र है जिसमें बाह्य डेटा शामिल नहीं है) और फिर प्लेसहोल्डर को सामान्य रूप में इस्तेमाल किया जा सकता है।

String makePlaceholders(int len) पर विचार करें जो कि अल्पविराम के साथ अलग-अलग len प्रश्नावली देता है, फिर:

 String[] names = { "name1", "name2" }; // do whatever is needed first String query = "SELECT * FROM table" + " WHERE name IN (" + makePlaceholders(names.length) + ")"; Cursor cursor = mDb.rawQuery(query, names); 

बस स्थानों के रूप में ठीक से कई मानों को पास करना सुनिश्चित करें SQLite में मेजबान मापदंडों की डिफ़ॉल्ट अधिकतम सीमा 99 9 है – कम से कम एक सामान्य बिल्ड में, एंड्रॉइड के बारे में निश्चित नहीं है 🙂

हैप्पी कोडिंग


यहां एक कार्यान्वयन है:

 String makePlaceholders(int len) { if (len < 1) { // It will lead to an invalid query anyway .. throw new RuntimeException("No placeholders"); } else { StringBuilder sb = new StringBuilder(len * 2 - 1); sb.append("?"); for (int i = 1; i < len; i++) { sb.append(",?"); } return sb.toString(); } } 

यूज़र -1663 9 के उत्तर के आधार पर लघु उदाहरण:

 public Cursor selectRowsByCodes(String[] codes) { try { SQLiteDatabase db = getReadableDatabase(); SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); String[] sqlSelect = {COLUMN_NAME_ID, COLUMN_NAME_CODE, COLUMN_NAME_NAME, COLUMN_NAME_PURPOSE, COLUMN_NAME_STATUS}; String sqlTables = "Enumbers"; qb.setTables(sqlTables); Cursor c = qb.query(db, sqlSelect, COLUMN_NAME_CODE+" IN (" + TextUtils.join(",", Collections.nCopies(codes.length, "?")) + ")", codes, null, null, null); c.moveToFirst(); return c; } catch (Exception e) { Log.e(this.getClass().getCanonicalName(), e.getMessage() + e.getStackTrace().toString()); } return null; } 

अफसोस की बात है कि ऐसा करने का कोई तरीका नहीं है (जाहिर 'name1', 'name2' एक मूल्य नहीं है और इसलिए तैयार कथन में उपयोग नहीं किया जा सकता है)।

तो आपको अपनी जगहें कम करना होगा (जैसे बहुत विशिष्ट, पुन: प्रयोज्य क्वेरी जैसे WHERE name IN (?, ?, ?) ) या संग्रहीत कार्यविधियों का उपयोग नहीं करना और एसक्यूएल इंजेक्शन को कुछ अन्य तकनीकों से रोकने की कोशिश करना।

जैसा कि स्वीकार्य जवाब में है, लेकिन अल्पविराम-पृथक '?' उत्पन्न करने के लिए कस्टम फ़ंक्शन का उपयोग किए बिना सुझाव कृपया नीचे कोड जांचें

 String[] names = { "name1", "name2" }; // do whatever is needed first String query = "SELECT * FROM table" + " WHERE name IN (" + TextUtils.join(",", Collections.nCopies(names.length, "?")) + ")"; Cursor cursor = mDb.rawQuery(query, names); 

आप sqlite बाध्यकारी पैरामीटर का लाभ लेने के लिए TextUtils.join(",", parameters) का उपयोग कर सकते हैं, जहां parameters "?" साथ एक सूची है प्लेसहोल्डर और परिणाम स्ट्रिंग कुछ ऐसा है "?,?,..,?"

यहाँ एक छोटा उदाहरण है:

 Set<Integer> positionsSet = membersListCursorAdapter.getCurrentCheckedPosition(); List<String> ids = new ArrayList<>(); List<String> parameters = new ArrayList<>(); for (Integer position : positionsSet) { ids.add(String.valueOf(membersListCursorAdapter.getItemId(position))); parameters.add("?"); } getActivity().getContentResolver().delete( SharedUserTable.CONTENT_URI, SharedUserTable._ID + " in (" + TextUtils.join(",", parameters) + ")", ids.toArray(new String[ids.size()]) ); 

दरअसल, आप rawQuery के बजाय क्वेरी के एंड्रॉइड के मूल तरीके का उपयोग कर सकते हैं:

 public int updateContactsByServerIds(ArrayList<Integer> serverIds, final long groupId) { final int serverIdsCount = serverIds.size()-1; // 0 for one and only id, -1 if empty list final StringBuilder ids = new StringBuilder(""); if (serverIdsCount>0) // ambiguous "if" but -1 leads to endless cycle for (int i = 0; i < serverIdsCount; i++) ids.append(String.valueOf(serverIds.get(i))).append(","); // add last (or one and only) id without comma ids.append(String.valueOf(serverIds.get(serverIdsCount))); //-1 throws exception // remove last comma Log.i(this,"whereIdsList: "+ids); final String whereClause = Tables.Contacts.USER_ID + " IN ("+ids+")"; final ContentValues args = new ContentValues(); args.put(Tables.Contacts.GROUP_ID, groupId); int numberOfRowsAffected = 0; SQLiteDatabase db = dbAdapter.getWritableDatabase()); try { numberOfRowsAffected = db.update(Tables.Contacts.TABLE_NAME, args, whereClause, null); } catch (Exception e) { e.printStackTrace(); } dbAdapter.closeWritableDB(); Log.d(TAG, "updateContactsByServerIds() numberOfRowsAffected: " + numberOfRowsAffected); return numberOfRowsAffected; } 

यह मान्य नहीं है

 String subQuery = "SELECT _id FROM tnl_partofspeech where part_of_speech = 'noun'"; Cursor cursor = SQLDataBase.rawQuery( "SELECT * FROM table_main where part_of_speech_id IN (" + "?" + ")", new String[]{subQuery});); 

यह मान्य है

 String subQuery = "SELECT _id FROM tbl_partofspeech where part_of_speech = 'noun'"; Cursor cursor = SQLDataBase.rawQuery( "SELECT * FROM table_main where part_of_speech_id IN (" + subQuery + ")", null); 

ContentResolver का उपयोग करना

 String subQuery = "SELECT _id FROM tbl_partofspeech where part_of_speech = 'noun' "; final String[] selectionArgs = new String[]{"1","2"}; final String selection = "_id IN ( ?,? )) AND part_of_speech_id IN (( " + subQuery + ") "; SQLiteDatabase SQLDataBase = DataBaseManage.getReadableDatabase(this); SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); queryBuilder.setTables("tableName"); Cursor cursor = queryBuilder.query(SQLDataBase, null, selection, selectionArgs, null, null, null); 

मुझे एक ही समस्या का सामना करना पड़ा और मुझे लगता है कि स्वीकार किए जाते हैं जवाब वास्तव में जटिल है। मैं आगे बढ़ना पसंद करता हूं:

 String names = "'name1', 'name2'"; // in the code this is dynamically generated String query = "SELECT * FROM table WHERE name IN (" + names + ")"; Cursor cursor = mDb.rawQuery(query, null);