Предложение WHERE IN в Android sqlite?

Я не могу заставить предложение WHERE IN работать с базой данных Android SQLite.

Есть ли способ выполнить такой оператор в Android? :

SELECT body FROM table1 WHERE title IN ('title1', 'title2', 'title3')

person fediva    schedule 06.06.2011    source источник
comment
Какое исключение вы получаете? Как выглядит ваш код?   -  person Maximus    schedule 07.06.2011


Ответы (7)


Вы можете использовать TextUtils.join(",", parameters), чтобы воспользоваться преимуществами параметров привязки sqlite, где parameters — это список с "?" заполнителями, а результирующая строка — что-то вроде "?,?,..,?".

Вот небольшой пример:

Set<Integer> positionsSet = membersListCursorAdapter.getCurrentCheckedPosition();
List<String> ids = new ArrayList<>();
List<String> parameters = new ArrayList<>();
for (Integer position : positionsSet) {
    ids.add(String.valueOf(membersListCursorAdapter.getItemId(position)));
    parameters.add("?");
}
getActivity().getContentResolver().delete(
    SharedUserTable.CONTENT_URI,
    SharedUserTable._ID + " in (" + TextUtils.join(",", parameters) + ")",
    ids.toArray(new String[ids.size()])
);
person epool    schedule 27.03.2015
comment
Спасибо. Это мне очень помогло. Я не знал, что должен указать отдельный заполнитель ('?') для каждого параметра в предложении IN. Я думал, что одного заполнителя с одним параметром String (в нем объединено несколько значений) было достаточно. - person stan0; 08.03.2017
comment
это как ты сделал? Строка где = ContactsContract.RawContacts.CONTACT_ID + IN (? ?); - person Oladipo Olasemo; 17.05.2017

Вам придется использовать метод rawQuery:

Cursor c = db.rawQuery("SELECT body FROM table1 WHERE title IN ('title1', 'title2', 'title3')");
person Cristian    schedule 06.06.2011
comment
Спасибо! Это сработало. Я пытался сделать это раньше, но, видимо, у меня были некоторые проблемы с синтаксисом... - person fediva; 07.06.2011
comment
Поскольку rawQuery подвержен SQL-инъекциям, если мы передаем динамические параметры, можете ли вы предложить получить аналогичные результаты без rawQuery? - person Gem; 29.01.2019

Если вы используете поставщика контента, вы можете использовать функцию запроса как таковую:

getContentResolver().query(URI,new String[] {"body"}, "title IN ?", new String[] {"('title1','title2','title3')"}, null)

Обратите внимание, что я не проверял это, но, согласно документации, это должно работать.

person Dimse    schedule 06.06.2011
comment
это не работает в Android 4.0.4 - классы-оболочки SQLite вызывают исключения - person Anatoliy; 15.10.2012
comment
Это не сработает. Он будет переведен в SELECT body FROM table1 WHERE title IN '('title1', 'title2', 'title3')'. Обратите внимание на ' вокруг всей аргументной части. - person Antimonit; 15.09.2015

Пожалуйста, взгляните на этот ответ. Мне помогло в похожем случае.

String[] names = { "name1", "name2" }; // do whatever is needed first
String query = "SELECT * FROM table" + " WHERE name IN (" + makePlaceholders(names.length) + ")";
Cursor cursor = mDb.rawQuery(query, names);

Главное здесь — предоставить переменные заполнители вопросительного знака (?), чтобы они соответствовали вашим элементам предложения IN. И конечно же аргумент для них в виде массива String.

person Anatoliy    schedule 15.10.2012
comment
Вы знаете, как это сделать с массивом INT[]? Мой столбец, к которому применяется IN, имеет тип INTEGER. - person Brabbeldas; 15.05.2015
comment
вам нужно преобразовать произвольный массив в String[] - person Anatoliy; 27.05.2015

Другой способ сделать это

Cursor mCursor = SQLiteDatabase.query(true, "Name of table","String array of selection columns","title  in ('title1', 'title2', 'title3')", null, null, null, null, null);
if (mCursor != null) {
    mCursor.moveToFirst();
}
person Zain Ali    schedule 06.07.2012

Вам нужно написать rawquery таким образом -

 Cursor cursor = db.rawQuery("SELECT colunm1 FROM table WHERE colunm2 IN ('value1', 'value2', 'value3')", null);
person Kamal Bunkar    schedule 24.03.2018

Добавление к ответу Кристиана: хотя его ответ будет работать, вы должны попытаться использовать правильный способ запроса:

db.rawQuery("Select * from table1 where title = ?", new String[]{param1});

Этот подход также можно использовать с предложением WHERE IN, но передаваемая строка должна быть в формате «asd», «zxc», «qwe».

Нравится:

String param1 = "\'asd\',\'zxc\',\'qwe\'";
db.rawQuery("Select * from table1 where title in (?)", new String[]{param1});
person lxknvlk    schedule 28.07.2015