2011-01-16 6 views
21

実行しようとしていますNOT INNOT INのリストは動的です。コードでAndroid Sqlite 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

「?値のリストの代わりに。そのため、リストをパラメータ化しようとすることはほとんどありません。もちろん、2,4,16値のプリペイドド・ステートメント..." type NOT IN (?,?)", new String[]{ "connect","answer" },...を作成することはできますが、リモートのRDBMSを持つサーバーでさえ、疑わしい値を持っています。 リストが動的である場合

db.query(TABLE, new String[] { "id", ""}, " type NOT IN ('connect','answer')", 
    null, null, null, null); 
を実行する場合は、文字列をエスケープして単一引用符付きのリストに入れなければなりません。

+0

問題の文字列は、あなたが提供するリストではなく、ユーザーが提供するリストからある場合、あなたは彼らが安全だということを知ることができます(たとえaが含まれていない限り)エスケープする必要はありません。 –

+0

それは結局私が解決した解決策です。少しトリックを望んでいたが、私はそこにないと推測している。 – Bostone

+0

INがうまくサポートされているHibernate Criteriaについてよく知っていますが、Android SDKではこれと同等のものは見つかりませんでした。 –

1

あなたは、動的な値「ではない」のリストを含む文字列を作成し、次のようにあなたのSQL文字列の末尾に要素を追加した場合、それは、動的に「ないで」を使用することができ:

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を使用すると、argsを動的に設定できます。例えば

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); 
関連する問題