代码之家  ›  专栏  ›  技术社区  ›  martinomburajr

Android Room-处理对象中的对象列表和查询结果

  •  6
  • martinomburajr  · 技术社区  · 8 年前

    我正在使用Android的房间数据库,在理解如何:

    1. 当我添加 Person 向数据库中添加所有变量,例如。 List<Shoe> , List<Pet> 等等。
    2. 创建关系,以便在检索 ,检索其所有字段,例如 Pet, Shoe, Shirt 等等(不确定这是什么类型的查询)

    3. 执行简单查询,例如。 Retrieve Person where 鞋名称 = "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 回复  |  直到 8 年前
        1
  •  14
  •   Thorbear    8 年前

    房间不直接支持此功能,因为 potential issues with lazy loading ,但使用一些刀的技巧是可能的。您需要显式地处理插入,并且要立即查询所有内容,您需要一个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。

    推荐文章