2011-01-16 8 views
21

मैं NOT IN चलाने की कोशिश कर रहा हूं, जहां NOT IN सूची गतिशील है। जैसेएंड्रॉइड स्क्लाइट इन, सिंटैक्स में नहीं

SELECT id, type FROM CONTACTS where type NOT IN ('connect','answer') 

कुछ कोड में मेरी व्यर्थ प्रयास किया गया था:

db.query(TABLE, new String[] { "id", ""}, " type NOT IN (?)", "connect,answer", 
    null, null, null); // didn't work 
db.query(TABLE, new String[] { "id", ""}, " type NOT IN (?)", "'connect','answer'", 
null, null, null); // didn't work 

इस पर मेरे ले कि ? प्रतिस्थापन एक तर्क के रूप में मेरी अल्पविराम सूची व्यवहार करता है। मुझे एक समाधान मिला लेकिन यह बदसूरत है इसलिए मैं इसे यहां पोस्ट नहीं करूंगा जब तक कि कोई और अधिक सुरुचिपूर्ण

उत्तर

21

आप केवल एक '?' नहीं रख सकते मूल्यों की सूची के बजाय। इस प्रकार, parametrize सूचियों की कोशिश करने से लाभ प्राप्त करने के लिए बहुत कम है। कोई भी, 2,4,16-मूल्य तैयार बयान ..." type NOT IN (?,?)", new String[]{ "connect","answer" },... बना सकता है लेकिन रिमोट आरडीबीएमएस वाले सर्वर पर भी संदिग्ध मूल्य है। इसके बजाय,

db.query(TABLE, new String[] { "id", ""}, " type NOT IN ('connect','answer')", 
    null, null, null, null); 
करें यदि सूची गतिशील है, तो आपको तारों से बचना होगा और उन्हें एकल उद्धृत सूची में रखना होगा।

+0

प्रश्न में तार एक सूची आप एक सूची प्रदान करता है उपयोगकर्ता के बजाय प्रदान से कर रहे हैं, तो आप को पता कर सकते हैं कि वे सुरक्षित हैं:

उदाहरण के लिए

और उन्हें बचने के लिए भी नहीं है (जब तक वे एक ') नहीं है। –

+0

यह काफी समाधान है जिसके साथ मैं समाप्त हुआ। एक छोटी सी चाल की उम्मीद कर रहा था लेकिन मुझे लगता है कि कोई नहीं है। अभी भी यह देखने के लिए थोड़ा इंतजार करना है कि क्या कोई वैकल्पिक सुझाव होगा – Bostone

+0

हाइबरनेट मानदंड से अधिक परिचित है जिसका आईएन अच्छी तरह से समर्थित है, हालांकि एंड्रॉइड एसडीके में कोई समकक्ष नहीं मिला है। –

1

आप में तरह निम्नलिखित यह गतिशील का उपयोग "नहीं में" अगर आप गतिशील रूप से एक स्ट्रिंग है कि की सूची होती है बनाने के मूल्यों "नहीं में" और फिर अपने एसक्यूएल स्ट्रिंग के अंत करने के लिए उन्हें संलग्न हो सकते हैं:

public static Vector selectAllFormTypesForAccountIgnoringFormVersions(
     int accountId, String formsIgnored) { 
protected final static String selectAllFormTypesForAccountIgnoringFormVersions = "SELECT DISTINCT FormType.*" 
     + " FROM FormType, Form WHERE Form.accountId=? AND FormType.formTypeContentId = Form.formTypeContentId" 
     + " AND Form.formVersionId NOT IN ("; 

    Vector allFormTypes = new Vector(); 
    SQLiteDatabase db = null; 
    String[] selectionArgs = { Integer.toString(accountId)}; 

    try { 
     DataManager_Platform dataManager = (DataManager_Platform) DataManager_Platform 
       .getDataManager(); 
     db = (SQLiteDatabase) dataManager.getDatabase(); 
     Cursor cursor = db.rawQuery(
       selectAllFormTypesForAccountIgnoringFormVersions + formsIgnored + ")", 
       selectionArgs); 

     if (cursor.getCount() > 0) { 
      cursor.moveToFirst(); 
      while (!cursor.isAfterLast()) { 
       FormType_Platform formType = new FormType_Platform(); 
       formType.populateModel(cursor); 
       allFormTypes.add(formType); 
       cursor.moveToNext(); 
      } 
     } 
    } catch (Exception e) { 
     System.out.println("Error: " + e.getMessage()); 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (db != null) { 
       db.close(); 
      } 
     } catch (Exception e) { 
      System.out.println("Error: " + e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 

    return allFormTypes; 
} 
3

आप गतिशील सेट तर्कों के लिए String.format का उपयोग कर सकते हैं।

db.query(TABLE, new String[] { "id", ""}, " type NOT IN (?)", "connect,answer", null, null, null); 

=>

String argsArrayToString(List<String> args) { 
    StringBuilder argsBuilder = new StringBuilder(); 
    argsBuilder.append("("); 
    final int argsCount = args.size(); 
    for (int i=0; i<argsCount; i++) { 
     argsBuilder.append(args.get(i)); 
     if (i < argsCount - 1) { 
      argsBuilder.append(","); 
     } 
    } 
    argsBuilder.append(")"); 
} 

db.query(TABLE, new String[] { "id", ""}, String.format(" type NOT IN (%s)", argsArrayToString(arrays)), null, null, null, null); 
संबंधित मुद्दे