【问题标题】:Problems with sql query using rawQuery使用 rawQuery 的 sql 查询问题
【发布时间】:2020-07-13 12:28:32
【问题描述】:

我的问题是,我在下面放置的查询(在我的 PC 上的 DbBrowser for Sqlite 中使用)正确返回了数据。但是一旦在应用程序中执行,它就不会显示我缺少 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)

【问题讨论】:

    标签: android sqlite kotlin android-sqlite


    【解决方案1】:

    我假设两个联合查询返回相同数量的列,因为您没有收到任何错误。

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

    此外,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() 将不会返回 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]
    )
    

    【讨论】:

    • 谢谢,我没注意到。现在一切正常。
    猜你喜欢
    • 2015-02-18
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多