как создать сущность для Room если pojo схема состоит из нескольких классов

public class Example {

    @SerializedName("firstName")
    @Expose
    public String firstName;

    @SerializedName("surName")
    @Expose
    public String surName;

    @SerializedName("secondName")
    @Expose
    public String secondName;

    @SerializedName("contractData")
    @Expose
    public List<ContractDatum> contractData = new ArrayList<ContractDatum>();

    public Example withFirstName(String firstName) {
        this.firstName = firstName;
        return this;
    }

    public Example withSurName(String surName) {
        this.surName = surName;
        return this;
    }

    public Example withSecondName(String secondName) {
        this.secondName = secondName;
        return this;
    }

    public Example withContractData(List<ContractDatum> contractData) {
        this.contractData = contractData;
        return this;
    }
}
public class ContractDatum {

    @SerializedName("contract")
    @Expose
    public String contract;
    @SerializedName("contractDate")
    @Expose
    public String contractDate;

    public ContractDatum withContract(String contract) {
        this.contract = contract;
        return this;
    }

    public ContractDatum withContractDate(String contractDate) {
        this.contractDate = contractDate;
        return this;
    }
}

Делаю так в сущности пишу так

 @TypeConverters({InfoConverter.class})
    public List<Object> contractData;

в конверторе вот так

public class InfoConverter {
    @TypeConverter
    public Object fromContractData(List<Object> contractData){
        return contractData.stream().collect(Collectors.joining(","));
    }

    @TypeConverter
    public List<Object> toContractData(Object data){
        return Object.asList(data.split(","));
    }

Ответы (1 шт):

Автор решения: Сергей Бувака

Вам необходимо отметить основной класс который вы хотите сохранить аннотацией @Entity.

А для каждого не примитивного члена класса написать конвертор.

Вот здесь есть пример https://startandroid.ru/ru/courses/architecture-components/27-course/architecture-components/539-urok-11-room-type-converter.html

P.S. Не имеет значения насколько сложный у вас объект и сколько в нем массивов. Вы можете просто распарсить его в Json строку и сохранить в Room как строковое поле.

Можно к примеру использовать библиотеку Gson

interface TypeConverter<T> {

    val clazz: Type

    @TypeConverter
    fun fromType(model: T): String =
        Gson().toJson(model)

    @TypeConverter
    fun fromString(value: String): T {
        return Gson().fromJson<T>(value, clazz)
    }
}

И вот так примерно это может выглядеть

class StringListConverter : TypeConverter<List<String>> {

    override val clazz: Type
        get() = object : TypeToken<List<String>>() {}.type
}

class IntListConverter : TypeConverter<List<Int>> {

    override val clazz: Type
        get() = object : TypeToken<List<Int>>() {}.type
}

class ImagesConfigConverter : TypeConverter<ImagesConfigModel> {

    override val clazz: Type
        get() = object : TypeToken<ImagesConfigModel>() {}.type
}

P.P.S Более простой пример на Java

@TypeConverter
public static List<MyObject> storedStringToMyObjects(String data) {
    Gson gson = new Gson();
    if (data == null) {
        return Collections.emptyList();
    }
    Type listType = new TypeToken<List<MyObject>>() {}.getType();
    return gson.fromJson(data, listType);
}

@TypeConverter
public static String myObjectsToStoredString(List<MyObject> myObjects) {
    Gson gson = new Gson();
    return gson.toJson(myObjects);
}
→ Ссылка