SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Como filtrar em um para muitos relacionamento com o db da sala do Android


Vejamos como @Relation funciona. Existem duas etapas:
  1. A sala executa a consulta que você colocou em @Query para obter usuários. Como de costume, essa consulta não inclui nenhuma associação. Esta consulta é usada para obter a parte dos dados que persistem na tabela principal (User no seu caso).
  2. Room executa mais uma consulta. Para isso, veja @Relation parâmetros e entende qual tabela deve consultar em seguida (Record no seu caso) e qual deve ser a condição de junção com o resultado do usuário. É importante que você não tenha como se intrometer nesse processo de criação de consultas. Você não pode definir o filtro em Record campos de, por exemplo. Obtendo o resultado O Room o transforma no formato necessário (preenche a Lista de Records ).

Você tem escolhas:
  1. Para mudar a relação para definir filtros em Records table (mas com isso você obterá dados simples sem List).
public class UserWithRecords {
    @Embedded
    protected Record record;
    @Relation(
            parentColumn = "user_id",
            entity = User.class,
            entityColumn = "id"
    )
    protected User user;
}

e para alterar a consulta para:
@Transaction
@Query("SELECT * FROM record_table WHERE date=:date")
public LiveData<List<UserWithRecords>> getDailyRecord(String date);
  1. Não usar @Relation em tudo, escreva a consulta com junções como a que você tentou. Mas então você deve transformar manualmente o resultado para a forma necessária no código (resultado em loop e lista de formação).