Как сохранить POJO с аннотацией Relation в библиотеке сохранения комнаты?

В настоящее время я играю с Room, чтобы сравнить его с Realm, и у меня уже есть так много вопросов о том, как лучше всего это делать.

В моем примере приложения у меня есть очень простая модель, в которой Person может иметь Cat и Dog.

Здесь классы Java.

Классы Cat и Dog наследуются от класса 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 ;

Заранее спасибо за вашу помощь !


person rolandl    schedule 26.07.2017    source источник


Ответы (1)


как сохранить список объектов RoomPersonWithAnimals?

Вы этого не сделаете, по крайней мере, в 1.0.0-alpha6 версии Room, поскольку это не сущности.

Для каждого объекта моего списка RoomPersonWithAnimals я должен воспроизвести 3 запроса?

Да. Вы можете использовать runInTransaction()< /a> для выполнения этих трех операций внутри одной транзакции SQLite.

person CommonsWare    schedule 26.07.2017
comment
Спасибо за ваш ответ. Можете ли вы подтвердить мне, что мой POJO - это правильный способ создания отношений 1 ко многим между объектами? - person rolandl; 26.07.2017
comment
@rolandl: я бы описал это как способ атомарного извлечения связанных сущностей. Для этого не обязательно использовать @Relation. Вы можете использовать runInTransaction() и использовать другие методы DAO на основе сущностей, которые вы хотите использовать для извлечения содержимого для вашей модели представления (или чего-то еще). Итак, @Relation — это вариант, но не требование. - person CommonsWare; 26.07.2017
comment
@CommonWare: Спасибо за ответ. Но как я могу создать отношение 1 ко многим, используя только внешний ключ? Например, если я хочу смоделировать тот факт, что собаку могут держать несколько человек. Я не могу ввести внешний ключ человека в свой класс животных. Может ли объект содержать список внешних ключей? Я не вижу этого в документации. - person rolandl; 26.07.2017
comment
@rolandl: я не могу использовать внешний ключ человека в моем классе животных - почему бы и нет? - person CommonsWare; 26.07.2017
comment
@CommonWare: если я это сделаю, как справиться с тем фактом, что собаку могут держать один, два или более человек? - person rolandl; 27.07.2017
comment
@rolandl: Тогда у вас есть отношения M: N, а не 1: N, поскольку предположительно у человека может быть более одной кошки или собаки. Для этого потребуется таблица соединений (смоделированная как объект Room). - person CommonsWare; 27.07.2017
comment
@CommonWare: да, ты прав! Можете ли вы привести пример таблицы соединений, смоделированной как объект «Комната»? - person rolandl; 27.07.2017