tableColumns
null
для всех столбцов, как в SELECT * FROM ...
new String[] { "column1", "column2", ... }
для определенных столбцов, как в SELECT column1, column2 FROM ...
- вы также можете поместить сюда сложные выражения:
new String[] { "(SELECT max(column1) FROM table1) AS max" }
даст вам столбец с именем, max
содержащий максимальное значениеcolumn1
WhereClause
- часть, которую вы указываете после
WHERE
без этого ключевого слова, например"column1 > 5"
- следует включать
?
для динамических вещей, например "column1=?"
-> см.whereArgs
whereArgs
- укажите содержимое, которое заполняет каждый
?
в whereClause
порядке их появления
другие
- точно так же, как
whereClause
оператор после ключевого слова или null
если вы его не используете.
пример
String[] tableColumns = new String[] {
"column1",
"(SELECT max(column1) FROM table2) AS max"
};
String whereClause = "column1 = ? OR column1 = ?";
String[] whereArgs = new String[] {
"value1",
"value2"
};
String orderBy = "column1";
Cursor c = sqLiteDatabase.query("table1", tableColumns, whereClause, whereArgs,
null, null, orderBy);
// since we have a named column we can do
int idx = c.getColumnIndex("max");
эквивалентен следующему необработанному запросу
String queryString =
"SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
"WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);
Используя версию Where / Bind -Args, вы получаете автоматически экранированные значения, и вам не нужно беспокоиться о том, содержат ли входные данные '
.
Небезопасно: String whereClause = "column1='" + value + "'";
Безопасно:String whereClause = "column1=?";
потому что, если значение содержит '
ваш оператор, либо прерывается, и вы получаете исключения, либо делает непредвиденные вещи, например, value = "XYZ'; DROP TABLE table1;--"
может даже удалить вашу таблицу, поскольку оператор станет двумя операторами и комментарием:
SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'
использование версии args XYZ'; DROP TABLE table1;--
будет экранировано 'XYZ''; DROP TABLE table1;--'
и будет рассматриваться только как значение. Даже если '
он не предназначен для плохих вещей, все еще довольно часто люди используют его в своих именах или используют в текстах, именах файлов, паролях и т. Д. Поэтому всегда используйте версию args. (Вполне нормально встраивать int
и другие примитивы непосредственно внутрь whereClause
)