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 whereshoe.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 - 处理对象中的对象列表和查询结果的主要内容,如果未能解决你的问题,请参考以下文章

Room DAO 更新如何最好地处理旧的不需要的数据

Android Room数据库使用

Android Room数据库使用

如何使用 PHP 从 Google Clas-s-room 课程列表中过滤课程对象字段

将 TypeConverters 应用到 Dao Android Room

Kotlin:如何将对象列表插入到 Room 中?