как создать сущность для 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);
}