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
гдеArgs
?
в 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 + "'";
Safe: 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
, хотя)
Где предложение и args работают вместе, чтобы сформировать инструкцию WHERE SQL-запроса. Итак, скажите, что вы хотите выразить
WHERE Column1 = 'value1' AND Column2 = 'value2'
. Тогда ваши whereClause и whereArg будут выглядеть следующим образом
String whereClause = "Column1 =? AND Column2 =?";
String[] whereArgs = new String[]{"value1", "value2"};
Если вы хотите выбрать все столбцы таблицы, я верю, что пустая строка прошла to tableColumns будет достаточным.
db.query
(
TABLE_NAME,
new String[] { TABLE_ROW_ID, TABLE_ROW_ONE, TABLE_ROW_TWO },
TABLE_ROW_ID + "=" + rowID,
null, null, null, null, null
);
TABLE_ROW_ID + "=" + rowID, here "=" is the where clause
to select all values you will have to give all column names
or you can use a raw query like this
db.rawQuery("SELECT * FROM permissions_table WHERE name = 'Comics' ", null);
, и вот хороший учебник для базы данных
http://www.anotherandroidblog.com/2010/08/04/android-database-tutorial/
, если ваш SQL-запрос похож на этот
SELECT col-1, col-2 FROM tableName WHERE col-1=apple,col-2=mango
GROUPBY col-3 HAVING Count(col-4) > 5 ORDERBY col-2 DESC LIMIT 15;
. Тогда для метода query () мы можем сделать так: -
String table = "tableName";
String[] columns = {"col-1", "col-2"};
String selection = "col-1 =? AND col-2=?";
String[] selectionArgs = {"apple","mango"};
String groupBy =col-3;
String having =" COUNT(col-4) > 5";
String orderBy = "col-2 DESC";
String limit = "15";
query(tableName, columns, selection, selectionArgs, groupBy, having, orderBy, limit);
Это более общий ответ, который должен быть быстрой ссылкой для будущих зрителей.
Пример
SQLiteDatabase db = helper.getReadableDatabase();
String table = "table2";
String[] columns = {"column1", "column3"};
String selection = "column3 =?";
String[] selectionArgs = {"apple"};
String groupBy = null;
String having = null;
String orderBy = "column3 DESC";
String limit = "10";
Cursor cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);
blockquote>
table
String: имя таблицы для компиляции запроса.columns
String: список возвращаемых столбцов. Передача null вернет все столбцы, которые не рекомендуется для чтения данных из хранилища, которые не будут использоваться.selection
String: фильтр, объявляющий, какие строки возвращать, отформатированные как SQL WHERE (за исключением самого ГДЕ). Передача null вернет все строки для данной таблицы.selectionArgs
String: Вы можете включить? S в выборку, который будет заменен значениями из selectionArgs, чтобы они отображались в выбранном. Значения будут связаны как строки.groupBy
String: фильтр, объявляющий, как группировать строки, отформатированные как предложение SQL GROUP BY (исключая сам GROUP BY). Передача null приведет к тому, что строки не будут сгруппированы.having
String: фильтр объявляет, какие группы строк следует включать в курсор, если используется группировка строк, отформатирована как предложение SQL HAVING (исключая САМОСТОЯТЕЛЬСТВО). Передача null приведет к включению всех групп строк и требуется, если группировка строк не используется.orderBy
Строка: порядок упорядочения строк, отформатированных как предложение SQL ORDER BY (исключая ORDER BY). Передача null будет использовать порядок сортировки по умолчанию, который может быть неупорядоченным.limit
String: Ограничивает количество строк, возвращаемых запросом, отформатированное как предложение LIMIT. Передача нулевого значения не означает предложение LIMIT.
limit
, например. developer.android.com/reference/android/database/sqlite/… это просто простая конкатенация текста в конце, чтобы вы могли положить, например."some_column LIMIT 10"
вorderBy
, и он все равно будет работать – zapl 29 March 2014 в 00:11table1 CROSS JOIN table2
в качестве имени табуляции. Но есть точка, где я бы посмотрел на rawquery: stackoverflow.com/q/10598137/995891 – zapl 6 September 2017 в 08:28query
просто добавляют к аргументам (см. Источник) несколько ключевых слов, таких какSELECT
иFROM
, а затемrawQuery
с результирующей строкой запроса. Если ваш запрос не вписывается в доступные аргументыquery
, просто напишите строку запроса самостоятельно. – zapl 6 September 2017 в 09:16