Метод SQLiteDatabase.query

106

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

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

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

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

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

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

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

  • 1
    Попробуйте простой подход, как это
  • 0
    Я знаю этот метод. Но я пытаюсь узнать, как реализовать метод запроса вместо rawQuery.
Теги:

4 ответа

200
Лучший ответ

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

  • 0
    Где лимит / смещение попадают в эту ... группу? иметь? Сортировать по?
  • 3
    @ Lion789, есть несколько версий, которые имеют параметр limit , например developer.android.com/reference/android/database/sqlite/… в конце концов, это всего лишь простая конкатенация текста, так что вы можете поместить, например, "some_column LIMIT 10" в orderBy и все равно будет работать
Показать ещё 4 комментария
13

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

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

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

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

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

  • 0
    не вложить ? в ' , ' добавляется автоматически, если требуется
11

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

Пример

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.
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, 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/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню