Вопрос по android, sqlite – Метод SQLiteDatabase.query

116

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

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

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

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

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

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

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

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

Ваш Ответ

5   ответов
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/

0

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);
15

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

Example

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);

Explanation from the документация

table String: The table name to compile the query against. columns String: A list of which columns to return. Passing null will return all columns, which is discouraged to prevent reading data from storage that isn't going to be used. selection String: A filter declaring which rows to return, formatted as an SQL WHERE clause (excluding the WHERE itself). Passing null will return all rows for the given table. selectionArgs String: You may include ?s in selection, which will be replaced by the values from selectionArgs, in order that they appear in the selection. The values will be bound as Strings. groupBy String: A filter declaring how to group rows, formatted as an SQL GROUP BY clause (excluding the GROUP BY itself). Passing null will cause the rows to not be grouped. having String: A filter declare which row groups to include in the cursor, if row grouping is being used, formatted as an SQL HAVING clause (excluding the HAVING itself). Passing null will cause all row groups to be included, and is required when row grouping is not being used. orderBy String: How to order the rows, formatted as an SQL ORDER BY clause (excluding the ORDER BY itself). Passing null will use the default sort order, which may be unordered. limit String: Limits the number of rows returned by the query, formatted as LIMIT clause. Passing null denotes no LIMIT clause.
16

чтобы сформировать оператор WHERE запроса SQL. Так сказать, что вы хотите выразить

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

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

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

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

не включают? в',' добавляется автоматически при необходимости
232

null for all columns as in SELECT * FROM ... new String[] { "column1", "column2", ... } for specific columns as in SELECT column1, column2 FROM ... - you can also put complex expressions here:
new String[] { "(SELECT max(column1) FROM table1) AS max" } would give you a column named max holding the max value of column1

whereClause

the part you put after WHERE without that keyword, e.g. "column1 > 5" should include ? for things that are dynamic, e.g. "column1=?" -> see whereArgs

whereArgs

specify the content that fills each ? in whereClause in the order they appear

the others

just like whereClause the statement after the keyword or null if you don't use it.

Example

String[]  = 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", , 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;--'

используя версию argsXYZ'; DROP TABLE table1;-- будет сбежал в'XYZ''; DROP TABLE table1;--' и будет рассматриваться только как значение. Даже если' не предназначен для того, чтобы совершать плохие поступки, но все же довольно часто люди используют его в своих именах или используют в текстах, именах файлов, паролях и т. д. Поэтому всегда используйте версию args. (Это нормально строитьint и другие примитивы прямо вwhereClause хоть)

@VijayKumbhoje вы должны быть в состоянии положить, например,table1 CROSS JOIN table2 в качестве имени таблицы. Но есть момент, когда я бы посмотрел на rawquery:stackoverflow.com/q/10598137/995891
Где лимит / смещение попадают в эту ... группу? иметь? Сортировать по?
Любой вариант здесь, чтобы объединить 2 таблицы?
@ Lion789 есть несколько версий, которые имеютlimit параметр, напримерdeveloper.android.com/reference/android/database/sqlite/… в конце концов, это всего лишь простая конкатенация текста, так что вы можете поместить, например,"some_column LIMIT 10" вorderBy и все равно будет работать
@VijayKumbhoje все, что вы чувствуете себя более комфортно с / выглядит в конечном итоге чище.query методы просто добавляют несколько ключевых слов, таких какSELECT а такжеFROM к аргументам(see source) тогда сделайrawQuery с результирующей строкой запроса. Если ваш запрос не вписывается в доступные аргументыquery, просто напишите строку запроса самостоятельно.

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