2011-01-16 6 views
21

Ich versuche NOT IN ausführen wählen Sie, wo NOT IN Liste ist dynamisch. So etwas wieAndroid Sqlite IN, nicht in Syntax

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

Im Code meine vergeblichen Versuche waren:

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 

Meine Meinung dazu ist, dass ? Substitution als einziges Argument meine Komma Liste behandelt. Ich fand eine Lösung, aber es ist ziemlich hässlich, also werde ich es hier nicht posten, bis jemand mit etwas eleganterem kommt

Antwort

21

Sie können nicht nur ein '?' anstelle einer Liste von Werten. Daher ist es wenig sinnvoll, Listen zu parametrisieren. Man kann natürlich 2,4,16-Wert vorbereitete Anweisungen erstellen ..." type NOT IN (?,?)", new String[]{ "connect","answer" },..., aber selbst auf einem Server mit Remote-RDBMS hat es einen fraglichen Wert. Tun Sie stattdessen

db.query(TABLE, new String[] { "id", ""}, " type NOT IN ('connect','answer')", 
    null, null, null, null); 
Wenn die Liste dynamisch ist, müssen Sie die Strings entkommen und sie in einzelne zitierte Liste setzen.

+0

Wenn die Saiten in Frage aus einer Liste sind Ihnen eher als eine Liste der Benutzer bereitstellt, dann können Sie wissen, dass sie sicher sind und muss ihnen nicht einmal entkommen (außer sie enthalten ein '). –

+0

Das ist so ziemlich die Lösung, mit der ich endete. Hatte auf einen kleinen Trick gehofft, aber ich vermute, es gibt keinen. Ich möchte noch ein wenig warten, um zu sehen, ob es alternative Vorschläge geben wird – Bostone

+0

Vertrauter mit Hibernate-Kriterien, deren IN gut unterstützt wird, jedoch keine Entsprechung in Android SDK gefunden. –

1

können Sie es dynamisch „nicht in“ verwenden, wenn Sie dynamisch einen String erstellen, der die Liste der „nicht in“ Werte enthält, und fügen Sie sie dann an das Ende der SQL-Zeichenfolge wie in der folgenden:

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

Sie können String.format zum dynamischen Festlegen der Argumente verwenden.

zum Beispiel:

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);