如何使用Room Peristence Library中的Relation注释保存POJO?

时间:2017-07-26 14:15:24

标签: android sqlite dao android-room android-components

我目前正在与Room进行比较,以便与Realm进行比较,我已经有很多关于最佳做事方式的问题。

在我的示例应用中,我有一个非常简单的模型,其中一个Person可以有CatDog s。

这里是java类。

CatDog类继承自Animal类:

public abstract class RoomAnimal
{

  @PrimaryKey
  public int id;

  public int age;

  public String name;

}

Cat类:

@Entity(tableName = "cat")
public final class RoomCat
    extends RoomAnimal
{

}

Dog类:

@Entity(tableName = "dog")
public final class RoomDog
    extends RoomAnimal
{

  public enum RoomColor
  {
    Black, White
  }

  public static final class RoomColorConverter
  {

    @TypeConverter
    public RoomColor fromString(String color)
    {
      return color != null ? RoomColor.valueOf(color) : null;
    }

    @TypeConverter
    public String fromRealmColor(RoomColor color)
    {
      return color.toString();
    }

  }

  @TypeConverters(RoomColorConverter.class)
  public RoomColor color;

}

Person类:

@Entity(tableName = "person")
public final class RoomPerson
{

  @PrimaryKey
  public int id;

  public String name;

}

我还有一个POJO,以模拟用户可以拥有猫狗的事实:

public final class RoomPersonWithAnimals
{

  @Embedded
  public RoomPerson person;

  @Relation(parentColumn = "id", entityColumn = "id", entity = RoomDog.class)
  public List<RoomDog> dogs;

  @Relation(parentColumn = "id", entityColumn = "id", entity = RoomCat.class)
  public List<RoomCat> cats;

}

问题是:如何保存RoomPersonWithAnimals个对象列表?

我无法在Insert课程中使用Dao注释,因为RoomPersonWithAnimals不是Entity

对于我RoomPersonWithAnimals列表中的每个对象,我应该运行3个请求吗?

  • 一个是为了插入person属性;
  • 一个是为了插入cats;
  • 的列表
  • 一个是为了插入dogs;
  • 的列表

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  

如何保存RoomPersonWithAnimals对象列表?

至少在Room的1.0.0-alpha6版本中,你不会,因为那些不是实体。

  

对于我的RoomPersonWithAnimals列表中的每个对象,我应该播放3个请求吗?

是。您可以使用runInTransaction()在单个SQLite事务中执行这三个操作。