выполнение запроса на sqlite с использованием заданной строки

#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) для ее создания