#java #android #sqlite #android-sqlite
#java #Android #sqlite #android-sqlite
Вопрос:
Я новичок в sqlite и database. У меня есть заданный ввод. когда я регистрирую его, он выглядит так :
D/tag input: [item1,item2,item3,item4]
теперь я хочу выполнить запрос к этим элементам в моей базе данных. Но я ничего не получаю от этого. вот мой запрос :
cursor = db.rawQuery("SELECT * from menu_items where menu_item_name=?", new String[]{input})
Я не знаю, где я делаю неправильно. Может ли кто-нибудь помочь мне в этом случае?
Спасибо
Комментарии:
1. Это
input
массив или строка?2. это не массив . это строка
3. Заключенный в квадратные скобки?
Ответ №1:
Поскольку input
это строка, содержащая список строк, разделенных запятыми, вы не можете использовать операторы =
или IN
.
Что вам нужно, так это оператор LIKE
.
Если в значении input
есть также квадратные скобки:
cursor = db.rawQuery(
"SELECT * FROM menu_items WHERE ',' || REPLACE(REPLACE(?, '[', ''), ']', '') || ',' LIKE '%,' || menu_item_name || ',%'",
new String[]{input}
);
Если нет, то код можно упростить:
cursor = db.rawQuery(
"SELECT * FROM menu_items WHERE ',' || ? || ',' LIKE '%,' || menu_item_name || ',%'",
new String[]{input}
);
Если после каждой запятой есть пробел:
cursor = db.rawQuery(
"SELECT * FROM menu_items WHERE ', ' || ? || ', ' LIKE '%, ' || menu_item_name || ', %'",
new String[]{input}
);
Комментарии:
1. Привет. Спасибо за ваш ответ. для первого запроса он показывает ошибку перед запуском запроса. «<expression> ожидаемый, получил ‘REPLACE'». для второго нет ошибки, но он ничего не возвращает.
2. Я не знаю, как вы запускаете этот код. Вы скопировали и вставили его как есть? Проверьте демонстрацию, которая работает нормально: dbfiddle.uk /…
3. Я попытался удалить скобки вручную, и строка выглядит примерно так: «item1, item2, item3, item4» . затем я запускаю второй запрос. это работает, но просто возвращает один из них, а не все входные данные.
4. Есть ли пробелы между значениями и запятыми?
5. это работает нормально. Спасибо. это второй или третий раз, когда вы мне помогаете. Большое спасибо
Ответ №2:
Вы должны использовать IN, что-то вроде
cursor = db.rawQuery("SELECT * from menu_items where menu_item_name in "
"(" Arrays.stream(input).map(e-> "'" e "'").collect(Collectors.joining(",")) ")"
)
Комментарии:
1. Спасибо за ваш ответ. Я получил ошибку в разделе 2. сначала один Arrays.stream(ввод) с этой ошибкой: не удается разрешить метод ‘stream(java.lang. String)’ и Collectors.joining: для Api 24, а мой — 21 :
2. Идея состоит в том, чтобы иметь строку со списком
"('item1', 'item2', 'item3', 'item4')"
, вы можете использовать другие методы (например, цикл for) для ее создания