es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El inner join de Android Room devuelve columnas que no son utilizadas.

Tengo una tabla para pedidos y clientes. Los clientes contienen un ID de pedido y correo electrónico. Deseo buscar pedidos por correo electrónico del cliente.

Esto es lo que he ideado:

@RewriteQueriesToDropUnusedColumns
@Query(
    "SELECT * FROM orders INNER JOIN order_customers ON order_customers.order_id = orders.id " +
    "WHERE (order_customers.email LIKE '%' || :email || '%') ORDER BY orders.collection_time DESC"
)
protected abstract fun loadByEmail(email: String): LiveData<><order>>

Recibo una advertencia de incompatibilidad de cursos “la consulta devuelve algunas columnas que no se utilizan” porque cargo todas las columnas del cliente, cuando en realidad solo quiero los pedidos. Agregar el código sugerido @RewriteQueriesToDropUnusedColumns no hace nada. Entonces, ¿cuál es la mejor sintaxis aquí? ¿Debería simplemente incrustar los clientes en el DAO de pedidos, o hay una solución simple sin remodelar y migrar los datos?

Puedo ver que en lugar de decir SELECT *, puedo especificar individualmente cada columna del pedido, pero se supone que esa es la razón principal de Room…

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en tecnología de la información especializado en Android, SQL y Android-Room, sugeriría utilizar una sentencia SELECT con solo las columnas necesarias de ambas tablas. En este caso, solo necesitamos las columnas de la tabla de pedidos, por lo que podemos usar la siguiente consulta:

    @Query("SELECT orders.* FROM orders 
        INNER JOIN order_customers ON order_customers.order_id = orders.id 
        WHERE (order_customers.email LIKE '%' || :email || '%') ORDER BY orders.collection_time DESC")
    protected abstract fun loadByEmail(email: String): LiveData<><order>>
    

    Esta consulta selecciona solo las columnas de la tabla de pedidos, eliminando la advertencia de incompatibilidad de cursor. También incluye las cláusulas JOIN y WHERE necesarias para filtrar por correo electrónico del cliente.

    Si descubres que necesitas buscar frecuentemente por correo electrónico del cliente, puedes considerar incorporar los datos del cliente en el DAO de pedidos. Sin embargo, si esta es una consulta puntual, la solución anterior debería ser suficiente.

Comments are closed.