SQLiteDatabase.query метод

121

Я использую метод запроса SQLiteDatabase. Как использовать метод запроса?

Я пробовал это:

Cursor cursor = sqLiteDatabase.query(
    tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);

tableColumns - параметр columns строится следующим образом.

String[] columns = new String[]{KEY_ID, KEY_CONTENT};

Если нам нужно получить все поля, как нужно построить параметр столбца. Нужно ли нам включать все имена полей в массив String?

Как правильно использовать метод запроса?

sree_iphonedev
источник
1
Попробуйте простой подход , как это
Имран Rana
Я знаю этот метод. Но я пытаюсь узнать, как реализовать метод запроса вместо rawQuery.
sree_iphonedev

Ответы:

245

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)

zapl
источник
Куда входит ограничение / смещение в этой группе ...? иметь? Сортировать по?
Lion789
3
@ Lion789 существует несколько версий , которые имеют limitпараметр, например developer.android.com/reference/android/database/sqlite/... это всего лишь простой текст конкатенации в конце концов , так что вы можете поместить , например , "some_column LIMIT 10"в orderByи это будет еще работа
zapl
Есть ли здесь возможность присоединиться к 2 столам?
Виджай Кумбходже
2
@VijayKumbhoje вы можете указать, например, в table1 CROSS JOIN table2качестве имени таблицы. Но есть момент, когда я бы посмотрел на rawquery: stackoverflow.com/q/10598137/995891
zapl
3
@VijayKumbhoje - все, что вам удобнее / в итоге выглядит чище. Эти queryметоды просто добавляют к аргументам несколько ключевых слов, например SELECTи (см. Источник), а затем выполняют операцию с полученной строкой запроса. Если ваш запрос не вписывается в доступные аргументы , просто напишите строку запроса самостоятельно. FROMrawQueryquery
запл 06
21

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

пример

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 Строка: имя таблицы для компиляции запроса.
  • columns Строка: список возвращаемых столбцов. Передача null вернет все столбцы, что не рекомендуется для предотвращения чтения данных из хранилища, которое не будет использоваться.
  • selection Строка: фильтр, объявляющий, какие строки нужно вернуть, отформатированный как предложение SQL WHERE (за исключением самого WHERE). Передача null вернет все строки для данной таблицы.
  • selectionArgs Строка: вы можете включить? В выделение, которое будет заменено значениями из selectionArgs, чтобы они отображались в выделении. Значения будут привязаны как строки.
  • groupBy Строка: фильтр, объявляющий, как группировать строки, отформатированный как предложение SQL GROUP BY (за исключением самого GROUP BY). Передача null приведет к тому, что строки не будут сгруппированы.
  • having Строка: фильтр объявляет, какие группы строк включать в курсор, если используется группировка строк, в формате SQL-предложения HAVING (за исключением самого HAVING). Передача null приведет к включению всех групп строк и требуется, когда группировка строк не используется.
  • orderBy Строка: как упорядочить строки, отформатированные как предложение SQL ORDER BY (за исключением самого ORDER BY). При передаче null будет использоваться порядок сортировки по умолчанию, который может быть неупорядоченным.
  • limit Строка: ограничивает количество строк, возвращаемых запросом, отформатированных как предложение LIMIT. Передача null означает отсутствие предложения LIMIT.
Suragch
источник
16

Предложение Where и аргументы работают вместе, чтобы сформировать инструкцию WHERE запроса SQL. Так скажите, вы хотите выразить

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

Тогда ваши whereClause и whereArgs будут следующими

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

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

Ancantus
источник
не следует заключать ?в ', то 'автоматически добавляется при необходимости
zapl
1

если ваш 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
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, Здесь =есть whereоговорка. Чтобы выбрать все значения, вам нужно будет указать имена всех столбцов:

or you can use a raw query like this 
db.rawQuery("SELECT * FROM permissions_table WHERE name = 'Comics' ", null);

и вот хороший учебник для базы данных.

Ави Кумар Манку
источник