Как работать с реляционными данными во вложенных 1-в-1 объектах в комнате (конвертировать ForeignKey в объект)

Допустим, у меня есть Order и UserEntity это напоминает что-то вроде этого:

User.java:

@Entity
public class User {
    @PrimaryKey    
    public long id;
    @NonNull    
    public String username;
}

Order.java:

@Entity(foreignKeys = @ForeignKey(entity = User.class,
                                  parentColumns = "id",
                                  childColumns = "user_id",
                                  onDelete = ForeignKey.CASCADE,
                                  onUpdate = ForeignKey.CASCADE),
        indices = @Index("user_id"))
public class Order {
    @PrimaryKey
    public long id;
    public String description;

    @ColumnInfo(name = "user_id")
    public long userId;
    @Ignore
    private User user;
}

Таким образом, у меня есть Order с User внутри него, в базе данных, я сохраняю это отношение только с идентификатором пользователя как Foreign Key а не сам объект (это @Ignore d), так что все хорошо и реляционно и может быть расширено для использования с другими типами несколькими различными способами, запросами и т. д.

Теперь вопрос в том, как мне получить Order с User объект автоматически заполняется комнатой внутри него?

Если я использую @Embedded, затем Order а также User будет жить на одном столе, что не хорошо для реляционного разделения типов. Я мог бы вернуть их обоих вместе с JOIN но все же это работает только для типов данных, которые имеют разные имена (возможно, они оба имеют столбец с именем "description"?), кроме того, вставляя Order с User внутри это не будет просто с JOIN, @Relation работает только для одного ко многим, и это нужно List это не мой случай.

Я думал, что, возможно, @TypeConverter будет лучшим вариантом здесь, преобразование между long а также User, но это тоже сложно. @TypeConverter потребуется ссылка на DAO так что он мог бы запросить User и @TypeConverter статический метод, вызываемый Room, поэтому передача DAO может быть сложным и привести к множеству запахов кода, кроме этого дополнительного запроса для каждого User вызовет несколько поисков, которые не будут в том же @Transaction,

Я новичок в Room, но держу пари, что есть правильный способ исправить это, использовать Room с реляционными типами, как это было задумано, я просто не могу найти способ сделать эту работу просто и красиво, и не могу найти это в любых документах.

1 ответ

Теперь вопрос в том, как получить ордер с объектом User, автоматически заполняемым Room внутри него?

Я думаю, что нет готового решения для этого.

ИМХО, модель сущности (т.е. Order отображение FK с User.id) не должен распространяться на верхний уровень, такой как домен / уровень представления, обеспечивая DataMapper преобразовать модель объекта в модель предметной области (т.е. User содержит Order) для верхнего слоя может быть лучшим вариантом.

Другие вопросы по тегам