Я использую метод запроса SQLiteDatabase. Как использовать метод запроса?
Я пробовал это:
Cursor cursor = sqLiteDatabase.query(
tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);
tableColumns - параметр столбцов строится следующим образом.
String[] columns = new String[]{KEY_ID, KEY_CONTENT};
Если нам нужно получить все поля, как должен быть сконфигурирован параметр столбца. Нужно ли включать все имена полей в массив String?
Как правильно использовать метод запроса?
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
, хотя)
limit
, например developer.android.com/reference/android/database/sqlite/… в конце концов, это всего лишь простая конкатенация текста, так что вы можете поместить, например, "some_column LIMIT 10"
в orderBy
и все равно будет работать
Где предложение и args работают вместе, чтобы сформировать инструкцию WHERE SQL-запроса. Скажите, что вы хотите выразить
WHERE Column1 = 'value1' AND Column2 = 'value2'
Затем ваши whereClause и whereArgs будут выглядеть следующим образом
String whereClause = "Column1 =? AND Column2 =?";
String[] whereArgs = new String[]{"value1", "value2"};
Если вы хотите выбрать все столбцы таблицы, я верю, что пустая строка, переданная в tableColumns, будет достаточной.
?
в '
, '
добавляется автоматически, если требуется
Это более общий ответ, который должен быть быстрой ссылкой для будущих зрителей.
Пример
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);
Объяснение из документации
table
String: имя таблицы для компиляции запроса.columns
String: список возвращаемых столбцов. Передача null возвращает все столбцы, которые не рекомендуется для чтения данных из хранилища, которое не будет использоваться.selection
String: фильтр, объявляющий, какие строки возвращаются, отформатированные как предложение SQL WHERE (за исключением самого WHERE). Переходя null возвращает все строки для данной таблицы.selectionArgs
String: вы можете включить? s в выборку, который будет заменен значениями из selectionArgs, чтобы они появятся в выборе. Значения будут связаны как строки.groupBy
String: фильтр, объявляющий, как группировать строки, отформатированные как предложение SQL GROUP BY (исключая сам GROUP BY). Передача null приведет к тому, что строки не будут сгруппированы.having
String: фильтр объявляет, какие группы строк включать в курсор, если группировка строк используется, отформатирована как SQL HAVING (исключая САЙТ). Передача null приведет к тому, что все строки групп, которые должны быть включены, и требуется, если группировка строк не является используется.orderBy
String: Как упорядочить строки, отформатированные как предложение SQL ORDER BY (за исключением самого ORDER BY). Передача null будет использовать порядок сортировки по умолчанию, который может быть неупорядоченным.limit
String: Ограничивает количество строк, возвращаемых запросом, отформатированное как предложение LIMIT. Передача нулевого значения не означает предложение LIMIT.
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/