SQLite динамический запрос - PullRequest
0 голосов
/ 04 октября 2011

У меня есть база данных SQLite, и я хочу, чтобы пользователь выбирал фильтр. Например, у меня есть база данных книг, и пользователь просто хочет посмотреть данные из «Книг Кристи Агаты» ..

Итак, я сделал спиннер с вариантами выбора, а затем с намерением передаю выбранное поле другому действию, которое выполняет запрос выбора.

У меня вопрос, как я могу сделать динамический запрос? Подумайте, что у меня более 1 фильтра, как я могу сделать предложение ГДЕ в зависимости от данных, которые я передал из другого действия намеренно?

спасибо

Ответы [ 4 ]

1 голос
/ 04 октября 2011

Ленивый, но проверенный и верный:

String query = "Select id FROM books WHERE 1=1"
if (condition1) query+= " AND name="+theName;
if (condition2) query+= " AND author="+theAuthor;
if (condition3) query+= " AND price="+thePrice;

Если у вас есть полный контроль над опциями с помощью блесны, это безопасно. Если это текст редактирования, используйте подготовленные состояния и связывайте аргументы, чтобы избежать SQLI.

0 голосов
/ 04 октября 2011

Не уверен, что это самый умный способ сделать это, но предположим, что вы заранее знаете, что можете иметь 1 целочисленный фильтр (цена) и 1 строковый фильтр (имя автора), я бы попробовал:

SELECT* ИЗ КНИГИ ГДЕ (цена <0 ИЛИ И BOOKS.price = цена) И (author = "" ИЛИ BOOKS.author = автор); </p>

Я не эксперт по SQLite, пожалуйста, проверьте синтаксис.Хитрость здесь в том, чтобы установить цену <0, если фильтр не установлен (следовательно, все строки учитываются, так как условие цена <0 истинно), и установить автора как пустую строку, чтобы не фильтровать по автору (SELECT не будетотфильтруйте эти строки, так как условие истинно). </p>

Это будет работать!

0 голосов
/ 04 октября 2011
boolean filterName = false;
boolean filterPrice = false;
ArrayList<String> selectionArgs = new ArrayList<String>();
String query = "SELECT * FROM BOOKS WHERE 1=1";
if(filterName) {
    selectionArgs.add(searchString);
    query += " AND NAME = ?";
}
if(filterPrice) {
    selectionArgs.add(priceString);
    query += " AND PRICE= ?";
}

Cursor c = m_Database.rawQuery(query, (String[])selectionArgs1.toArray());
0 голосов
/ 04 октября 2011

public Cursor rawQuery (String sql, String [] selectionArgs)

Генерация строкового SQL с ? для привязки и добавление аргументов в selectionArgs.

...