Veamos cómo @Relation
obras. Hay dos etapas:
- 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). - 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 enRecord
los campos de , por ejemplo. Obtener el resultado Room lo transforma en el formato necesario (llena la Lista deRecords
).
Tiene opciones:
- 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);
- 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).