Проблемы с запросом sql с использованием rawQuery - PullRequest
1 голос
/ 13 июля 2020

Моя проблема в том, что приведенный ниже запрос, используемый в DbBrowser для Sqlite на моем P C, возвращает данные правильно. Но после выполнения в приложении он не показывает мне все данные, которые мне не хватает в результате UNION SELECT, это как если бы я решил только первую часть перед UNION

val parametro_lista_seleccionada: Array<String> =
        arrayOf(lista_seleccionada.toString()) //Creamos un array con el id de la lista seleccionada para pasarla como parametro al SELECT
val cursor_consulta_sql: Cursor = bd_conexion.rawQuery("SELECT * FROM contenido_lista AS cl, productos AS p WHERE cl.id_lista = ? AND cl.id_producto = p.id_producto UNION SELECT * FROM contenido_lista AS cl, productos_manuales AS pm WHERE cl.id_lista = ? AND cl.id_producto = pm.id_producto ORDER BY p.id_seccion,pm.id_seccion" ,parametro_lista_seleccionada)

1 Ответ

0 голосов
/ 13 июля 2020

Я предполагаю, что оба объединенных запроса возвращают одинаковое количество столбцов, поскольку вы не получаете никаких ошибок.

Вы должны использовать правильный синтаксис JOIN с предложением ON, а не этот архаичный синтаксис c с запятой.

Кроме того, предложение ORDER BY, когда оно используется в конце UNION, применяется к результату UNION, а не к любому из участвующих запросов. Таким образом, вы не можете использовать псевдонимы таблиц, которые вы ранее установили, для столбцов после ORDER BY.

Наконец, в вашем запросе есть 2 ? заполнителей, поэтому вы должны передать в качестве 2-го аргумента rawQuery() массив из 2 строк. Я предполагаю, что это та же строка, но вы должны использовать ее дважды в массиве.

Так что измените на это:

val parametro_lista_seleccionada = arrayOf(lista_seleccionada.toString(), lista_seleccionada.toString())
val cursor_consulta_sql: Cursor = bd_conexion.rawQuery(
    "SELECT * " +
    "FROM contenido_lista AS cl INNER JOIN productos AS p " + 
    "ON cl.id_producto = p.id_producto " + 
    "WHERE cl.id_lista = ? " + 
    "UNION " + 
    "SELECT * " + 
    "FROM contenido_lista AS cl INNER JOIN productos_manuales AS pm " + 
    "ON cl.id_producto = pm.id_producto " + 
    "WHERE cl.id_lista = ? " + 
    "ORDER BY id_seccion" ,
    parametro_lista_seleccionada
)

Просто по имени lista_seleccionada, я сделаю предположение, возможно, это не строка. Это список? Если это так, то lista_seleccionada.toString() вернет не 2 строки, а 1 строку, которая представляет собой список строк, разделенных запятыми. Итак, измените на:

val parametro_lista_seleccionada = arrayOf(lista_seleccionada[0], lista_seleccionada[1])

или, если элементы списка являются числами:

val parametro_lista_seleccionada = arrayOf(
    lista_seleccionada[0].toString(), 
    lista_seleccionada[1]
)
...