sql >> Base de Datos >  >> RDS >> SQLite

Cómo filtrar en una relación de uno a muchos con android room db

Veamos cómo @Relation obras. Hay dos etapas:

  1. Room ejecuta la consulta que has puesto en @Query para conseguir usuarios. Como de costumbre, esa consulta no incluye ningún Join. Esta consulta se utiliza para obtener esa parte de los datos que se conservan en la tabla principal (User en su caso).
  2. Room ejecuta una consulta más. Para eso mira @Relation parámetros y entiende qué tabla debe consultar a continuación (Record en su caso) y cuál debería ser la condición de unión con el resultado del usuario. Es importante que no tenga forma de entrometerse en este proceso de creación de consultas. No puede configurar el filtro en Record los campos de , por ejemplo. Obtener el resultado Room lo transforma en el formato necesario (llena la Lista de Records ).

Tiene opciones:

  1. Para cambiar la relación para establecer filtros en Records tabla (pero con eso obtendrá datos planos sin Lista).
public class UserWithRecords {
    @Embedded
    protected Record record;
    @Relation(
            parentColumn = "user_id",
            entity = User.class,
            entityColumn = "id"
    )
    protected User user;
}

y para cambiar la consulta a:

@Transaction
@Query("SELECT * FROM record_table WHERE date=:date")
public LiveData<List<UserWithRecords>> getDailyRecord(String date);
  1. No usar @Relation en absoluto, escribe una consulta con uniones como las que has probado. Pero luego debe transformar manualmente el resultado a la forma necesaria en el código (resultado de bucle y lista de formación).