Im working with Android’s Room Database and am having some big problems understanding how to:
- When I add a
Person
to the database, it adds all its variables e.g.List<Shoe>
,List<Pet>
etc. to the database as well. -
Create relations such that when I retrieve a
Person
, all its fields are retrieved e.gPet, Shoe, Shirt
etc. (Not sure what type of query that is) -
Perform simple query e.g.
Retrieve Person where
shoe.name= "boot"
;
I know you must use Foreign Key relationships with list of objects, otherwise with a single object one can use @Embed
or @TypeConverter
Sample code is shown below;
@Entity(tableName = "person") public class Person { @PrimaryKey @NonNull private String personId; private List<Pet> pets; private List<Shoe> shoes; private List<Shirt> shirts; } @Entity(foreignKeys = { @ForeignKey( entity = Person.class, parentColumns = "personId", childColumns = "personIdFk" ) }) public class Pet { String petId; String name; String personIdFk; //Foreign key to person } @Entity(foreignKeys = { @ForeignKey( entity = Person.class, parentColumns = "personId", childColumns = "personIdFk" ) }) public class Shoe { String shoeId; String name; String personIdFk; //Foreign key to person } @Entity(foreignKeys = { @ForeignKey( entity = Person.class, parentColumns = "personId", childColumns = "personIdFk" ) }) public class Shirt { String shirtId; String name; String personIdFk; //Foreign key to person }
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Room doesn’t support this directly due to some potential issues with lazy loading, but with some DAO trickery it is possible. You’ll need to handle the insertions explicitly, and to query everything at once you’ll need a POJO to wrap it all.
@Entity(foreignKeys = { @ForeignKey( entity = PersonEntity.class, parentColumns = "personId", childColumns = "personIdFk", onDelete = CASCADE ) }) public class Pet { @PrimaryKey private String petId; private String name; private String personIdFk; } @Entity(tableName = "person") public class PersonEntity { @PrimaryKey private String personId; } public class Person { @Embedded private PersonEntity personEntity; @Relation(parentColumn = "personId", entityColumn = "personIdFk") private List<Pet> pets; } @Dao public abstract class PersonDao { @Insert protected abstract void insert(PersonEntity personEntity); @Insert protected abstract void insert(List<Pet> pets); @Transaction public void insert(Person person) { insert(person.getEntity()); insert(person.getPets()); } @Query("SELECT * FROM person") public abstract List<Person> getAll(); } @Database(entities = {PersonEntity.class, Pet.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract PersonDao personDao(); }
Constructors, getters and setters omitted for brevity.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0