Im работает с базой данных в базе данных Android, и у меня возникают некоторые большие проблемы с пониманием того, как:
Person
в базу данных, он добавляет все свои переменные, например List<Shoe>
, List<Pet>
и т.д. В базу данных. Создавайте отношения таким образом, что когда я получаю Person
, все его поля извлекаются, например, Pet, Shoe, Shirt
и т.д. (Не уверен, какой тип запроса)
Выполните простой запрос, например, "Извлечь Retrieve Person where
shoe.name = "boot"
;
Я знаю, что вы должны использовать отношения внешнего ключа со списком объектов, иначе с помощью одного объекта можно использовать @Embed
или @TypeConverter
Пример кода показан ниже;
@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
}
Комната не поддерживает это напрямую из-за некоторых потенциальных проблем с ленивой загрузкой, но с некоторыми обманами DAO это возможно. Вам нужно будет обрабатывать вставки явно, и чтобы запросить все сразу, вам понадобится POJO, чтобы обернуть все это.
@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();
}
Конструкторы, геттеры и сеттеры опущены для краткости.