【问题标题】:Android Room - Handling List of Objects in an Object and querying resultAndroid Room - 处理对象中的对象列表和查询结果
【发布时间】:2018-05-25 00:05:27
【问题描述】:

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

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

  3. 执行简单查询,例如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
        }

【问题讨论】:

    标签: java android mysql android-room


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 2017-10-28
      • 2015-10-26
      • 2016-07-01
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多