Próbuję zaktualizować swoją wiedzę z Androida z nową Elementy architektury Android. Patrzę na to, jak trwać dane z Pokój, ale wydaje się Jest praktycznie bezużyteczny, jeśli faktycznie masz Dane relacyjne i jestem Mając nadzieję, że możesz mi pomóc zrozumieć coś, czego przegapiłem lub potwierdziłem, że pokój naprawdę nie działa dla żadnych poważnych danych relacyjnych.

Oto mój problem tak mały, jak mogę zaoferować.

Mam aplikację dla hodowców zwierząt i mam podmiot Animal. Powiedzmy, że mam podmiot {X1}}, który jest rekordem, jak bardzo zwierzę ważono w danej dacie. Animal ma do wielu relacji z Weight, aby stworzyć historię, ile ważono z czasem.

Według dokumentacji szkoleniowej w pomieszczeniu musiałbym utworzyć 3 klasę o nazwie AnimalWithWeights jak:

data class AnimalWithWeights(
    @Embedded val Animal: Animal,
    @Relation(
          parentColumn = "AnimalId",
          entityColumn = "AnimalId"
    )
    val Weights: List<Weight>
)

I dodaj funkcję do mojego DAO jak fun getAnimalsWithWeights(): List<AnimalWithWeights>.

@Transaction
@Query("SELECT * FROM Animal")
fun getAnimalsWithWeights(): List<AnimalWithWeights>

Ale nie mam tylko jednego związku.

My Animal Jednostka ma związki do innych {x1}} jak ojciec, matka, surogate matka, parter hodowli i relacje do innych typów podmiotów, takich jak {x3}}, Breeder, Breeder }, DNA i do wielu relacji dla Weights, Notes, MedicalTreatments, MedicalTreatments, MatingRecords, {{x10}} itp

Chyba że coś brakuje, brzmi to tak, jakbym musiał stworzyć klasę, która jest AnimalWithWeights, a następnie owinąć to w czwartej klasie o nazwie AnimalWithWeightsAndNotes

I owinąć, że w 5 klasie zwanej AnimalWithWeightsAndNotesAndMedicalTreatments

I owinąć to w 6 klasie o nazwie AnimalWithWeightsAndNotesAndMedicalTreatmentsAndMatingRecords

I owinąć to w 7. klasie o nazwie AnimalWithWeightsAndNotesAndMedicalTreatmentsAndMatingRecordsAndUltrasounds ...

I nawet nie dostałem się do ...AndFatherAndMotherAndSurrogateMotherAndBreedingParterAndBreedAndBreederAndBuyerAndDNA....

Obecnie używam ORMLITE, aby obsłużyć moją trwałość sqlite i obsługuje dobrze dane relacyjne, ale wydaje się, że wygląda Pokój jest naprawdę zaprojektowany tylko do obsługi płaskich danych.

Czy brakuje mi czegoś z pokojem?

Chciałbym móc korzystać z niektórych nowych funkcji, takich jak LiveData<>, dzięki czemu mogę uzyskać automatyczne wywołania zwrotne, gdy moje dane są aktualizowane, a więc to jeden z powodów, dla których szukałem w pokoju, ale tylko się wydaje prymitywne, aby móc obsługiwać realistyczny model danych relacyjnych.

0
Kenny Wyland 14 październik 2020, 18:09

1 odpowiedź

Najlepsza odpowiedź

Nie jest jasne z twojego posta, czy jesteś świadomy możliwości połączenia kilku @Relation s we wspomnianej Auxilary 3rd Class. Z Animal posiadający relacje z jedną do wielu i jeden do jednego do innych podmiotów technicznie potrzebujesz dodać tylko jedną końcową klasę AnimalWithAllStuff:

data class AnimalWithAllStuff(
    @Embedded val Animal: Animal,
    @Relation(
          parentColumn = "AnimalId",
          entityColumn = "AnimalId"
    )
    val weights: List<Weight>,
    @Relation(
          parentColumn = "AnimalId",
          entityColumn = "AnimalId"
    )
    val notes: List<Notes>,
    ....
    @Relation(
          parentColumn = "fatherId",
          entityColumn = "AnimalId"
    )
    val father: Animal,
    @Relation(
          parentColumn = "motherId",
          entityColumn = "AnimalId"
    )
    val mother: Animal,
    ....
)

Technicznie na każdym @Relation pomieszczenia wewnętrznie wywołuje oddzielne zapytanie, a jeśli używasz LiveData Ustawia Tracker, aby powiadomić obserwatora na dowolnej zmianie w Weight, Notes i tak dalej.

Wątpię jednak, że z tą strukturą możesz uzyskać, na przykład, father 's i mother "s, notatki i tak dalej.

1
sergiy tikhonov 14 październik 2020, 17:00