Передача параметров в SQLite-запросы [duplicate]

113
задан Xicky 12 February 2015 в 09:24
поделиться

5 ответов

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, хотя)

228
ответ дан zapl 17 August 2018 в 20:20
поделиться
  • 1
    Где Limit / offset попадает в эту группу? иметь? Сортировать по? – Lion789 28 March 2014 в 22:53
  • 2
    @ Lion789 существует несколько версий, которые имеют параметр limit, например. developer.android.com/reference/android/database/sqlite/… это просто простая конкатенация текста в конце, чтобы вы могли положить, например. "some_column LIMIT 10" в orderBy, и он все равно будет работать – zapl 29 March 2014 в 00:11
  • 3
    Любой вариант здесь, чтобы присоединиться к 2 таблицам? – Vijay Kumbhoje 6 September 2017 в 08:09
  • 4
    @VijayKumbhoje, вы должны быть в состоянии положить, например. table1 CROSS JOIN table2 в качестве имени табуляции. Но есть точка, где я бы посмотрел на rawquery: stackoverflow.com/q/10598137/995891 – zapl 6 September 2017 в 08:28
  • 5
    @VijayKumbhoje, что бы вы ни чувствовали себя более комфортно с / выглядели чище в конце. Методы query просто добавляют к аргументам (см. Источник) несколько ключевых слов, таких как SELECT и FROM, а затем rawQuery с результирующей строкой запроса. Если ваш запрос не вписывается в доступные аргументы query, просто напишите строку запроса самостоятельно. – zapl 6 September 2017 в 09:16

Где предложение и args работают вместе, чтобы сформировать инструкцию WHERE SQL-запроса. Итак, скажите, что вы хотите выразить

WHERE Column1 = 'value1' AND Column2 = 'value2'

. Тогда ваши whereClause и whereArg будут выглядеть следующим образом

String whereClause = "Column1 =? AND Column2 =?";
String[] whereArgs = new String[]{"value1", "value2"};

Если вы хотите выбрать все столбцы таблицы, я верю, что пустая строка прошла to tableColumns будет достаточным.

15
ответ дан Ancantus 17 August 2018 в 20:20
поделиться
  • 1
    не включайте ? в ', ' добавляется автоматически, если требуется – zapl 15 May 2012 в 13:49
 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/

0
ответ дан Avi Kumar Manku 17 August 2018 в 20:20
поделиться

, если ваш 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);
0
ответ дан Puneet Verma 17 August 2018 в 20:20
поделиться

Это более общий ответ, который должен быть быстрой ссылкой для будущих зрителей.

Пример

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 (за исключением самого ГДЕ). Передача 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.
14
ответ дан Suragch 17 August 2018 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: