The problem
Suppose you have multiple gardens each with a different number of plants. Your job is check every plant of each garden from time to time. Every visit you’ve to annotate some attributes of the plant, like if its well watered and its height. The app is meant to help during these visits.
My approach
I’d like to use Room Database. So I created an entity GardenVisit that have its unique id and the date of the visit. Then I’d need a GardenAnnotation entity. This entity would have a row for every plant of the garden with its id and the traits annotated on the visited day. I thought about creating an table for every GardenVisit and link them with a one-to-one relationship, but I couldn’t find a way to do this.
Why I want to create a GardenAnnotation table for every GardenVisit?
In the app you can delete a garden visit. So, when deleting it, it should delete its GardenAnnotation table as well. This seemed the easiest way to have this feature.
Conclusion
How can I create multiple tables of the same entity in Room Database and link them with another table?
If you have a better approach, I’d appreciate if you could share it. It feels weird to create a lot of tables of the same entity, actually.
2
Answers
Multiple tables for the sake of splitting up what is basically the same layout (schema) probably makes little sense and will likely complicate matters.
From your description you have some common things:-
I’d suggest tables accordingly.
A Garden table that likely has but may not be limited to a human identifier of the garden (Kew, Hanging Gardens of Babylon …. ) an (as it will already exist and is efficient) identifier (id).
A Plant table (dandelion, rose ….) with columns for id, name and perhaps other info about the plant.
A table (not mentioned) that maps/links/associates a plant to a garden, allowing a many to many relationship (a gardens can have many plants, a plant can be used in many gardens). 2 Columns one for the map to the Garden the other to the Plant.
A Visit table that has the date/time of the visit perhaps start/end and a map/link…. to the garden.
A Trait table e.g. well watered, dead (if I’m tending the plant) …. Columns would be id and trait (the exact requirements)
An Annotation table that will link to the visit (and therefore garden) and link to the plant within the garden and a link to the trait(s) to be assigned.
So the schema could be based upon the SQLite (to demonstrate how the database/relationships work from an SQLite pov) :-
The result of the query being :-
And Lets say the visit with an id of 1 is deleted (although you could perhaps consider the visit_done being true as effectively deleting (so you could always go back in time)) e.g. using :-
Then the same query returns :-
i.e. the three annotations for visit 3 have been removed
Ignoring the deletion i.e. with the visit with a visit_id of 3 remaining then the tables look like :-
garden
plant
trait
visit
garden_plant_map
annotation
Following on
The Entities. in Kotlin, from the above (work in progress/untested) :-
Garden
Plant
Trait
GardenPlantMap
Visit
Annotation
Two POJOs (alternatives) for getting the final query, which has the additional computed/derived column status Example1POJO and Example2POJO :-
and
A single Dao abstract class (could be interface) GardenVisitDao
An @Database class GardenVisitDatabase
Finally loading and extracting data from an Activity that replicates (closely) the SQL in the answer (two versions of the last query).
Result output to the log