Строка формы "?, ?, ..., ?"
может быть динамически созданной строкой и может быть безопасно помещена в исходный запрос SQL (потому что это ограниченная форма, не содержащая внешних данных), а затем заполнители могут использоваться как обычно.
Рассмотрим функцию String makePlaceholders(int len)
, которая возвращает len
вопросительные знаки, разделенные запятыми, а затем:
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);
Просто убедитесь, что передано ровно столько значений, сколько мест.Максимальный предел по умолчанию для параметров хоста в SQLite равен 999 - по крайней мере, в обычной сборке, не уверен насчет Android:)
Счастливое кодирование.
Здесьэто одна реализация:
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();
}
}