sql 使用 rawQuery 查询的问题

Problems with sql query using rawQuery

我的问题是,我在下面提出的查询在我 PC 上的 DbBrowser for Sqlite 中使用,returns 数据正确。但是一旦在应用程序中执行,它就不会显示我丢失的所有数据,从 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)

我假设两个联合查询 return 相同的列数,因为您不会收到任何错误。

您应该使用带有 ON 子句的正确 JOIN 语法,而不是这种带有逗号的陈旧语法。

此外,ORDER BY 子句在 UNION 末尾使用时,它应用于 UNION 的结果,而不应用于任何参与查询。
所以你不能使用你之前设置的表的别名,到ORDER BY.

之后的列

最后,在您的查询中有 2 个 ? 占位符,因此您必须将包含 2 个字符串的数组作为 rawQuery() 的第二个参数传递。我猜是同一个字符串,但你必须在数组中使用它两次。

所以改成这样:

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() 将不会 return 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]
)