Внешние поля в Entity (Android, room)

114
02 октября 2021, 08:50

Есть модель:

@Entity
public class MyModel{
    @NonNull
    @PrimaryKey
    private int id;
    private String field1;
    private int foreignKey;
    private String fieldTable2;
    // Далее геттеры и сеттеры.
}

Поля id и field1 должны быть частью таблицы MyModel. Но, поле fieldTable2 заполняется через INNER JOIN в запросе на основании поля foreignKey.

Если оставить всё как есть, в таблице MyModel будет создано полеfieldTable2`, что приведёт к денормализации структуры данных.

Вопрос. Как сделать чтобы поле fieldTable2 осталось в классе сущности и при этом не создавалось в таблице?

Answer 1

Тут два варианта:

1) положить ответственность за содержимое fieldTable2 на себя, прописав над ним аннотацию @Ignore. Поле в бд не будет, но и получая из бд экземпляр MyModel это поле будет пустым

2) Надстроить объект с Relation. Примерно так:

@Entity
public class MyModel{
    @NonNull
    @PrimaryKey
    private int id;
    private String field1;
    private int foreignKey;
}
public class MyModelWithField{
    @Embended
    public MyModel model;
    @Relation(parentColumn = "foreignKey", entityColumn = "key")
    public AnotherEntity field; // или public List<AnotherEntity> field; если 1 ко многим
}

Где AnotherEntity - это Entity для той таблицы, из которой выбираете по ключу данные

Теперь можно сделать вот такой запрос из DAO

@Query("select * from MyModel where *параметры*")
List<MyModelWithField> getBy(*параметры*)

По типу возвращаемого значения рум поймет, что вам нужно помимо таблицы MyModel притянуть еще и данные из другой таблицы.

Еще ремарка - нельзя использовать Relation внутри Entity. А то есть такой соблазн, по себе знаю =)

READ ALSO
Java как сделать файл запускаемым

Java как сделать файл запускаемым

У меня есть код на Java, я могу превратить его в exe но как я понял это плохоКак сделать так чтобы я мог запускать его без команды, как обычное приложение

125
Как закодировать большой массив байтов в base64 без Out of memory в Java?

Как закодировать большой массив байтов в base64 без Out of memory в Java?

На вход приходит byte[] fileData, надо получить на выходе закодированный String

165
Ошибка в IDE &quot;cannot resolve a symbol&quot;

Ошибка в IDE "cannot resolve a symbol"

Всем привет , писал код и вдруг IDE начала выдавать ошибку "cannot resolve a symbol"Помогите пожалуйста решить проблему

264
MySQL Сведение разных таблиц в одну

MySQL Сведение разных таблиц в одну

Доходы фитнесс-клуба состоят из покупок абонементов и складываются в таблицу:

147