Я использую метод запроса SQLiteDatabase. Как использовать метод запроса?
Я пробовал это:
Cursor cursor = sqLiteDatabase.query(
tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);
tableColumns - параметр columns строится следующим образом.
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
если вы его не используете.пример
эквивалентен следующему необработанному запросу
Используя версию Where / Bind -Args, вы получаете автоматически экранированные значения, и вам не нужно беспокоиться о том, содержат ли входные данные
'
.Небезопасно:
String whereClause = "column1='" + value + "'";
Безопасно:
String whereClause = "column1=?";
потому что, если значение содержит
'
ваш оператор, либо прерывается, и вы получаете исключения, либо делает непредвиденные вещи, например,value = "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
и это будет еще работаtable1 CROSS JOIN table2
качестве имени таблицы. Но есть момент, когда я бы посмотрел на rawquery: stackoverflow.com/q/10598137/995891query
методы просто добавляют к аргументам несколько ключевых слов, напримерSELECT
и (см. Источник), а затем выполняют операцию с полученной строкой запроса. Если ваш запрос не вписывается в доступные аргументы , просто напишите строку запроса самостоятельно.FROM
rawQuery
query
Это более общий ответ, призванный стать кратким справочником для будущих зрителей.
пример
Пояснение из документации
источник
Предложение Where и аргументы работают вместе, чтобы сформировать инструкцию WHERE запроса SQL. Так скажите, вы хотите выразить
Тогда ваши whereClause и whereArgs будут следующими
Если вы хотите выбрать все столбцы таблицы, я считаю, что нулевой строки, переданной в tableColumns, будет достаточно.
источник
?
в'
, то'
автоматически добавляется при необходимостиесли ваш SQL-запрос такой
Затем для метода query () мы можем сделать следующее: -
источник
TABLE_ROW_ID + "=" + rowID
, Здесь=
естьwhere
оговорка. Чтобы выбрать все значения, вам нужно будет указать имена всех столбцов:и вот хороший учебник для базы данных.
источник