Android Room - 处理对象中的对象列表和查询结果
Posted
技术标签:
【中文标题】Android Room - 处理对象中的对象列表和查询结果【英文标题】:Android Room - Handling List of Objects in an Object and querying result 【发布时间】:2018-05-25 00:05:27 【问题描述】:我正在使用 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
【问题讨论】:
【参考方案1】:由于某些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 Room - 处理对象中的对象列表和查询结果的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PHP 从 Google Clas-s-room 课程列表中过滤课程对象字段