Android Room - 处理对象中的对象列表和查询结果
Android Room - Handling List of Objects in an Object and querying result
我正在使用 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
}
由于某些 potential issues with lazy loading,Room 不直接支持此功能,但使用一些 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();
}
为简洁起见,省略了构造函数、getter 和 setter。
我正在使用 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
}
由于某些 potential issues with lazy loading,Room 不直接支持此功能,但使用一些 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();
}
为简洁起见,省略了构造函数、getter 和 setter。