Room: Embedded и List
Помогите, пожалуйста разобраться, как работать в Руме с List<MyClass>
У меня есть большой JSON разбитый на 30+ вложенных классов.
Забираю данные из инета. Все работает отлично.
Пытаюсь записать эти данные в Room.
Чтобы вложенные классы записывались в базу данных я использую на них аннотацию @Embedded
Но в некоторых классах, у меня параметром приходят не просто экземпляры классов, а массивы
@SerializedName("availableSegments")
var availableSegments: List<AvailableSegment>
если я попытаюсь повесить @Embedded на такой параметр, выдает ошибку
Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type).
Сам класс AvailableSegment состоит из других "кастомных" параметров (не примитивные String, Int, etc).
UPD!!!
условно...
у меня есть 3 класса:
@Entity(tableName = "car_table")
data class Car(
@Embedded var zerka: Zerkala,
@Embedded var side: Sidenia,
@PrimaryKey(autoGenerate = true) var primKey: Int = 0
)
data class Zerkala(
var kolvo: Int
)
data class Sidenia(
var color: String
)
вот так - все работает.
но если в главном классе я поменяю любой параметр на массив :
@Entity(tableName = "car_table")
data class Car(
@Embedded var zerka: Zerkala,
@Embedded var side: List<Sidenia>,
@PrimaryKey(autoGenerate = true) var primKey: Int = 0
)
Ничего не работает...
Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type). - java.util.ListD:\Program\AndroidProject\TesListRoom\app\build\tmp\kapt3\stubs\debug\by\wlad\koshelev\teslistroom\CarDataBaase.java:7: warning: Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide `room.schemaLocation` annotation processor argument OR set exportSchema to false.
Ответы (1 шт):
Если вам достаточно сохранить данные без необходимости построения запросов по ним, то просто сериализуйте их. Добавьте конвертеры:
public class Converters {
private static Gson gson = new Gson();
@TypeConverter
public static String toJson(List<AvailableSegment> segments) {
return gson.toJson(segments);
}
@TypeConverter
public static List<AvailableSegment> formJson(String json) {
return gson.fromJson(json, new TypeToken<List<AvailableSegment>>(){}.getType());
}
}
И добавьте их в описание room базы через @TypeConverters(Converters.class). embedded при этом не нужен.
Если вам хочется через один ко многим, то через @Relation. Но сохранять json тогда придется разными insert'ами в каждую из таблиц отдельно, в транзакции.
room.runInTransaction(()->{
carsDao.insert(cars);
carsDao.insert(allsegments);
});
И соответственно relation объявлять не в entity, а в отдельном классе, который будет возвращаться в query:
class CarWithSegment {
@Embedded
public Car car;
@Relation(parentColumn = "primKey", entityColumn = "car_id", entity = AvailableSegment.class)
public List<AvailableSegment> availableSegments;
}
и в @Dao
@Query("select * from cars")
CarWithSegment getCarsWithSegments();
ЗЫ Писал в окне редактирования, могут быть синтаксические ошибки.