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]
)
我的问题是,我在下面提出的查询在我 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]
)