sql >> Database >  >> RDS >> SQLite

Hoe te filteren in een-op-veel relatie met Android room db

Laten we eens kijken hoe @Relation werken. Er zijn twee fasen:

  1. Ruimte voert zoekopdracht uit die u in @Query heeft geplaatst gebruikers te krijgen. Zoals gewoonlijk bevat die zoekopdracht geen Joins. Deze query wordt gebruikt om dat deel van de gegevens op te halen dat in de hoofdtabel staat (User in jouw geval).
  2. Room voert nog een query uit. Daarvoor kijkt het naar @Relation parameters en begrijpt welke tabel het vervolgens moet opvragen (Record in uw geval) en wat de join-voorwaarde zou moeten zijn met het resultaat van de gebruiker. Het is belangrijk dat u zich op geen enkele manier kunt bemoeien met dit proces voor het maken van query's. U kunt geen filter instellen op Record 's velden, bijvoorbeeld. Resultaat krijgen Room transformeert het in het benodigde formaat (vult Lijst met Records in) ).

Je hebt keuzes:

  1. Om de relatie om te draaien om filters in te stellen op Records tabel (maar daarmee krijg je platte gegevens zonder lijst).
public class UserWithRecords {
    @Embedded
    protected Record record;
    @Relation(
            parentColumn = "user_id",
            entity = User.class,
            entityColumn = "id"
    )
    protected User user;
}

en om de zoekopdracht te wijzigen in:

@Transaction
@Query("SELECT * FROM record_table WHERE date=:date")
public LiveData<List<UserWithRecords>> getDailyRecord(String date);
  1. Niet gebruiken @Relation schrijf in ieder geval een query met Joins zoals je hebt geprobeerd. Maar dan moet je het resultaat handmatig in code omzetten in de benodigde vorm (loopresultaat en lijst vormen).



  1. Meerdere rijen invoegen met pg-promise

  2. Gegevens exporteren uit een MySQL-database

  3. mysql_insert_id alternatief voor postgresql

  4. Meerdere geparametriseerde variabelen toevoegen aan een database in c#