SORU
14 EYLÜL 2011, ÇARŞAMBA


Android/fıkra ve tutucular SQLite

Android içinde aşağıdaki sql sorgu girişimde bulunuyorum:

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

Ancak, android doğru değerlerle soru işareti yerine geçmez. Bu sql enjeksiyon karşı koruma sağlamaz ancak aşağıdakileri yapabilirim:

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

Bu sorunu nasıl ve tümce İÇİNDE kullanabilir miyim?

Teşekkürler.

CEVAP
14 EYLÜL 2011, ÇARŞAMBA


Bir dize şeklinde "?, ?, ..., ?" bir dinamik olarak oluşturulan dize ve güvenli bir şekilde koy içine orijinal SQL sorgu (çünkü kısıtlı bir form içeren bir dış veri) ve daha sonra yer tutucu olarak kullanılabilir normal.

len soru işaretleri virgül ile ayrılmış: döndüren bir fonksiyon String makePlaceholders(int len) düşünün

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

Sadece emin yerler tam olarak, birçok değerleri geçirmek için yapmak. Varsayılan maksimum SQLite limit of host parameters 999 - en azından normal yapılı, Android:) hakkında emin değilim

Mutlu kodlama.


Burada bir uygulama:

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • J Medema

    J Medema

    11 EKİM 2006
  • Kim Barbin

    Kim Barbin

    3 Mayıs 2012
  • Mindy

    Mindy

    20 NİSAN 2006