Метод SQLiteDatabase.query


121

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

Я спробував це:

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

tableColumns - параметр стовпців будується наступним чином.

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

Якщо нам потрібно отримати всі поля, то як слід будувати параметр стовпця. Чи потрібно нам включати всі назви полів у масив String?

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


1
Спробуйте простий підхід , як це
Імран Rana

Я знаю цей метод. Але я намагаюся навчитися реалізовувати метод запиту замість rawQuery.
sree_iphonedev

Відповіді:


244

стілКолонки

  • null для всіх стовпців як у SELECT * FROM ...
  • new String[] { "column1", "column2", ... }для конкретних стовпців як у SELECT column1, column2 FROM ...- ви також можете вводити сюди складні вирази:
    new String[] { "(SELECT max(column1) FROM table1) AS max" }дав би вам стовпець з назвою, що maxмістить максимальне значенняcolumn1

деЗастереження

  • частина, яку ви додаєте 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 + "'";
Безпечно: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;--'і вважатиметься лише значенням. Навіть якщо 'не призначено робити погані речі, все-таки досить часто люди мають його у своїх іменах або використовують у текстах, файлах, паролях тощо. Тому завжди використовуйте версію аргументів. (Добре будувати intта інші примітиви безпосередньо, whereClauseхоча)


Де обмеження / зсув потрапляє до цієї ... групи? маючи? Сортувати за?
Lion789

3
@ Lion789 існує кілька версій , які мають limitпараметр, наприклад developer.android.com/reference/android/database/sqlite / ... це всього лише простий текст конкатенації врешті-решт , так що ви можете помістити , наприклад , "some_column LIMIT 10"в orderByі це буде ще робота
zapl

Будь-який варіант тут приєднати 2 таблиці?
Vijay Kumbhoje

2
@VijayKumbhoje ви повинні мати змогу поставити, наприклад, table1 CROSS JOIN table2як ім'я таблиці. Але є точка , де я хотів би подивитися на rawquery: stackoverflow.com/q/10598137/995891
zapl

3
@VijayKumbhoje все, що тобі зручніше / виглядає чистіше. Ці queryметоди є лише додавши кілька ключових слів , як SELECTі FROMдо аргументів (див джерело) , то робити rawQueryз результуючого рядка запиту. Якщо ваш запит не добре вписується в доступні аргументи query, просто напишіть рядок запиту самостійно.
zapl

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). Після проходження нуля повертаються всі рядки для даної таблиці.
  • selectionArgs Рядок: Ви можете включити? S у виділення, яке буде замінено значеннями з selectArgs, щоб вони відображалися у виділенні. Значення будуть пов'язані як рядки.
  • groupBy Рядок: фільтр, який оголошує, як групувати рядки, відформатований як пункт SQL GROUP BY (за винятком самого GROUP BY). Якщо пропустити null, рядки не згрупуються.
  • having Рядок: Фільтр оголошує, які групи рядків включати в курсор, якщо використовується групування рядків, відформатований як пункт SAV HAVING (за винятком самого HAVING). Якщо пропустити null, всі групи рядків будуть включені і потрібні, коли групування рядків не використовується.
  • orderBy Рядок: Як замовити рядки, відформатовані як пункт SQL ORDER BY (за винятком самого ORDER BY). При передачі нуля використовується порядок сортування за замовчуванням, який може бути не упорядкованим.
  • limit Рядок: Обмежує кількість рядків, повернутих запитом, відформатованих як пункт LIMIT. Пропуск нуля не означає пункт LIMIT.

16

Де пункт та аргументи працюють разом, щоб сформувати твердження WHERE SQL-запиту. Тому скажіть, що ви хочете висловити

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

Тоді ваш whereClause та whereArgs будуть наступними

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

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


НЕ слід укладати ?в ', то 'автоматично додається при необхідності
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);

і ось хороший підручник для бази даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.