Фильтровать управляемый запрос по расширению файла (или, альтернативно, типу файла) для курсора Android

#android #sql #cursor #projection #mediastore

#Android #sql #курсор #проекция #mediastore

Вопрос:

Я хочу выполнить управляемый запрос с использованием Android SDK, где возвращаемые результаты фильтруются по соответствующему расширению файла (например, не обязательно по имени). Я провел немало исследований, устал и надеюсь, что сообщество сможет мне помочь.. Я уверен, что ответ есть, но вместо чтения книги по SQL или чего-то еще, я просто пытаюсь сделать что-то, что должно быть довольно простым, но не нахожу решения.

То, что я хочу сделать, это, по сути, что-то вроде:

 managedQuery(Audio.Media.EXTERNAL_CONTENT_URI, myProjection, Audio.Media.DATA   " like ? ", new String[] {"%mp3%"}, null );
  

Это работает, ЗА ИСКЛЮЧЕНИЕМ того, что, если заголовок имеет что-то вроде «mymp3.wav», этот запрос все равно вернет его, поскольку в имени есть ‘mp3’, но это не то, что я хочу -> Я хочу, чтобы он фильтровался исключительно на основе расширения файла (или, альтернативно, типа файла, если естьспособ сделать это [например, если имя расширения файла mp3 было изменено на .wav, даже если содержимое файла на самом деле является mp3, это также будет работать для моих целей]). В решении должен быть указан способ фильтрации для нескольких расширений / типов файлов (например, если я хочу, чтобы запрос возвращал все файлы .mp3, а также файлы .wav, но не файлы .amr).

Кроме того, пока у меня есть вы, я хочу отсортировать результаты в алфавитном порядке. Я пробовал что-то вроде:

 managedQuery(Audio.Media.EXTERNAL_CONTENT_URI, myProjection, null, null, MediaStore.Audio.Media.TITLE   " ASC" );
  

Однако это не фильтрует все результаты… то есть возвращаемый список сортируется, скажем, по названию mp3, а затем, в конце, он добавляется к списку .файлы wav также отсортированы в алфавитном порядке, но я хочу, чтобы весь список был в алфавитном порядке независимо от типа файла.

Я знаю, что кто-то здесь может легко ответить на этот вопрос -> заранее спасибо!!!

Комментарии:

1. что, если вы поместите «.» как {«%.mp3%»}?

2. Я пробовал %.mp3% раньше, но что-то еще, синтаксически, должно быть, было отключено, потому что это вызвало сбой, но теперь, да, это работает…. ОДНАКО, как заставить его работать для %.mp3% И %.wav% ??? (добавление другой строки в массив не работает; это вызывает сбой с сообщением: E / AndroidRuntime(9407): java.lang.RuntimeException: не удается запустить activity … android.database.sqlite. Исключение SQLiteException: привязка или индекс столбца вне диапазона: обрабатывать 0x388060

3. Попробуйте это, managedQuery (Аудио. Медиафайлы. EXTERNAL_CONTENT_URI, myProjection, Audio. Медиафайлы. ДАННЫЕ » нравится ? «, новая строка [] {«%.mp3″,»%.wav»}, null ); и дайте мне знать, что произойдет.

4. нет, это не работает. Я получаю ошибку, упомянутую в моем предыдущем комментарии… Но мне нравится помощь!!! Понравилось бы еще больше, если бы мы могли заставить его работать 😉

5. попробуйте запрос, предложенный Куртисом Нусбаумом?

Ответ №1:

Я думаю, все, что вам нужно сделать, это изменить %mp3% на %mp3 . Это приведет к тому, что «mp3» будет находиться в конце имени файла.

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

 managedQuery(
  Audio.Media.EXTERNAL_CONTENT_URI,
  myProjection, 
  Audio.Media.DATA   " like ? OR "   Audio.Media.DATA   " like ? ", 
  new String[] {"%mp3","%wav"}, 
  MediaStore.Audio.Media.TITLE   " ASC" );
  

Комментарии:

1. хорошо. Я думаю, что это немного лучше, чем ставить %.mp3%, как обсуждалось в комментариях выше. Тем не менее, мне все еще нужно иметь возможность иметь несколько selectionArgs (например, иметь возможность возвращать оба. файлы wav и .mp3) (и, желательно, все отсортированные). У вас есть решение?

2. Отлично сработало!! Спасибо за обновление вашего ответа! Я пробовал аудио. Медиафайлы. ДАННЫЕ » нравится ? ИЛИ как? » безрезультатно; не подумал попробовать и добавить второй ‘Audio. Медиафайлы. ДАННЫЕ ‘ там. БОЛЬШОЕ ВАМ СПАСИБО!! (и спасибо, пользователь370305, а также за вашу помощь / усердие!)

3. Да, это своего рода облом, который вы должны добавить аудио. Медиафайлы. ДАННЫЕ дважды, но это всего лишь синтаксис SQL для вас.

4. Хорошо, один последний (я клянусь) вопрос -> как сделать порядок сортировки ‘MediaStore. Аудио. Медиафайлы. TITLE «ASC»‘ сортировать результирующий список без учета регистра? Все мои вещи, которые начинаются со строчной буквы «a», находятся внизу вещей, которые начинаются с прописной буквы «Z» …???

5. @fatfreddyscat если у вас есть другой вопрос, пожалуйста, задайте его как другой вопрос. Таким образом, другим людям, которые ищут что-то подобное в будущем, не нужно смотреть на наши комментарии назад и вперед … и поэтому я могу получить больше репутации 😉