Как сохранить в room вложенный класс

172
17 августа 2021, 09:30

Сам вопрос - как сохранить в room поле класса которое представлено как Массив класса?

Товарищи,ниже будут представлены три класса.

По порядку.

Есть первый класс Item (он будет полем во втором классе) -

public class Item { 
    private String Id;
    private String name;
    private String category;
    private String url;
}

Есть второй класс Items (он же в свою очередь будет вложенным в третьем классе)

public class Items {  
    private int id; 
    private String unit;
    private String url;
    private ServerItem item;
}

B Третий класс ItemList

public class ItemList {
    private int id;
    private String name;
    private String listUrl;
    private ServerItems[] items;
}
Answer 1

Room за вас это не сделает, насколько мне известно. Вам придется самому записывать вложенные данные. Плюс, если не ошибаюсь, Relation не может использоваться внутри Entity. Так что делать надо примерно так:

Item - не Entity, а сабсущность для Items. В Items помечаем ее как Embedded. Не забываем про геттери и сеттеры, если хотите оставить поля приватными.

public class Item { 
    private String Id;
    private String name;
    private String category;
    private String url;
}
@Entity
public class Items {  
    private int id; 
    private String unit;
    private String url;
    private int list_id;
    @Embedded
    private ServerItem item;
}

Теперь в таблице Items в бд будут поля обоих классов, то есть room пишет их как одну структуру, а не разные. Естественно такой подход применим только если соотношение iTem <-> Items один к одному. Если это не так, то их нужно связывать ключом, то есть в Item должен находится id объекта Items или наоборот, если то один ко многим, или третьей таблицей с парами ключ-ключ, если это многие ко многим.

Теперь как записывать ItemList. Для начала в Items 100% должен быть ключ того ItemList, которому принадлежит данный Items. Если один Items может быть во многих листах то вместо поля list_id вам нужна новая таблица для связи многие ко многим.

Причем в самом ItemList списка не должно быть, т.к. Reltion не может быть в Entity. Нам нужен отдельный класс для Entity и отдельный Relation

@Entity
public class ItemList {
    private int id;
    private String name;
    private String listUrl;
}
public class ItemListWithList {
    @Embedded
    private ItemList itemList;
    @Relation(parentColumn = “id”, entityColumn = “list_id”)
    private ServerItems[] items;
}

Теперь можно создать запрос в DAO:

@Query(“SELECT * FROM ItemList ”)
List<ItemListWithList> getUsers();

Из типа возвращаемого значения Room поймет что помимо таблицы ItemList надо еще подтянуть и Items и вернет объекты с наполненными массивами.

Это мы про чтение. Запись нам придется реализовать самостоятельно, т.к. в DAO в insert вы не Entity отправить не можете. Просто пишем свой метод:

public void insert(List<ItemListWithList> list){
    for(ItemListWithList o : list){
        dao.insert(o.items);
        dao.insert(o.itemList);
    }
}

В kotlin т.к. DOA может быть не только интерфейс, но и абстрактный класс, мне удавалось как-то создавать свои методы прям в DAO, но не знаю получится ли так сделать на Java

READ ALSO
Как парсить AliExpress?

Как парсить AliExpress?

какие есть инструменты для парсинга AliExpress используя java? пробовал разными способами, но данные не приходили после парсинга

471
Как узнать сколько строк на html сайте

Как узнать сколько строк на html сайте

Мне просто нужно узнать сколько всего строк в html странице где будут данные подобного вида "World:5" Мне нужные эти данные только для split', чтоб...

170
как отключить очередь из Toast.makeText - java

как отключить очередь из Toast.makeText - java

Как сделать чтобы при нажатии на кнопку в которой код

186
Regex - выцепить комплексное число

Regex - выцепить комплексное число

Задан шаблон комплексного числа в виде шаблона {real, image}, например:

346