Нека да разгледаме как @Relation
върши работа. Има два етапа:
- Room изпълнява заявка, която сте поставили в
@Query
за да получите потребители. Както обикновено, тази заявка не включва никакви присъединявания. Тази заявка се използва за получаване на тази част от данните, които се съхраняват в основната таблица (User
във вашия случай). - Стаята изпълнява още една заявка. За това той разглежда
@Relation
параметри и разбира коя таблица трябва да потърси следващата (Record
във вашия случай) и какво трябва да бъде условие за присъединяване с резултата на потребителя. Важно е да нямате начин да се намесвате в този процес на създаване на заявки. Не можете да зададете филтър наRecord
полета на 's, например. Получаване на резултат Стаята го преобразува в необходимия формат (попълва Списък сRecords
).
Имате избор:
- За да обърнете отношение към задаване на филтри на
Records
таблица (но с това ще получите плоски данни без списък).
public class UserWithRecords {
@Embedded
protected Record record;
@Relation(
parentColumn = "user_id",
entity = User.class,
entityColumn = "id"
)
protected User user;
}
и да промените заявката на:
@Transaction
@Query("SELECT * FROM record_table WHERE date=:date")
public LiveData<List<UserWithRecords>> getDailyRecord(String date);
- Да не се използва
@Relation
изобщо, напишете заявка с Joins, както сте опитвали. Но след това трябва ръчно да трансформирате резултата в необходимата форма в кода (завъртане на резултата и формиране на списък).