2011-01-16 24 views
21

NOT IN listeyi çalıştırmaya çalışıyorum NOT IN listesinin dinamik olduğunu seçin. kodundaAndroid Sqlite IN, sözdizimi IN

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

gibi bir şey benim nafile girişimleri vardı: Bu konuda

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 

Benim alabilir ? ikame tek argüman olarak benim virgül listesini davranır olmasıdır. Bir çözüm buldum ama oldukça çirkin yani birileri daha zarif bir şeyle gelinceye kadar buraya göndermeyeceğim.

cevap

21

Sadece bir '?' Yerleştiremezsiniz. değerler listesi yerine. Bu nedenle, listeleri parametrize etmeye çalışmaktan kazanmak için çok az şey var. Tabii ki, 2,4,16-değerlikli hazırlanmış ..." type NOT IN (?,?)", new String[]{ "connect","answer" },... ifadelerini oluşturabilir, ancak uzak RDBMS'li bir sunucuda bile şüpheli bir değeri vardır. Bunun yerine, liste dinamikse,

db.query(TABLE, new String[] { "id", ""}, " type NOT IN ('connect','answer')", 
    null, null, null, null); 
yapın, dizelerden kaçmanız ve bunları tek tırnaklı listeye koymanız gerekir. Aşağıdaki gibi

+0

, o zaman kendilerini güvende olduğunu biliyorum: örneğin

ve onlardan kaçmak bile zorunda değiller (bir 'içermedikçe). –

+0

Bu, neredeyse bittiğim çözüm. Biraz hile umuyordum ama sanırım hiç yok. Yine de alternatif önerileri olup olmayacağını görmek için biraz beklemek istiyorum – Bostone

+0

IN iyi bir şekilde desteklenen Hibernate Criteria ile daha aşina, ancak Android SDK'da herhangi bir eşdeğer bulunamadı. –

1

Bunu dinamik olarak dinamik bir listesini içeren bir dize oluşturursanız o zaman değerleri "değil de" ve sql dizenin sonuna onları ekler "değil de" kullanmak olabilir:

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

Yayları dinamik olarak ayarlamak için String.format'ı kullanabilirsiniz. Söz konusu dizeleri kullanıcı sağlayan bir liste yerine sağlamak listeden ise

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