Как я могу обновить столбец TypeConverted объекта в функции Room Dao

У меня есть @Entity, который содержит переменную (список настраиваемых объектов) вместе с другими полями для таблицы. Я могу вставлять, извлекать и удалять из этого объекта.

Но я столкнулся с проблемой при обновлении объекта:

Я хочу обновить это конкретное поле, которое содержит список настраиваемых объектов в таблице, но при компиляции выдает ошибку:

error: Query method parameters should either be a type that can be converted into a
database column or a List / Array that contains such type. You can consider adding a Type Adapter for this.

Я мог бы обновить весь объект строки, но проблема заключается в обновлении этого единственного поля. Я использую TypeConverters в своем классе @Database, но я пробовал использовать их в Dao и самой функции обновления, но он сообщает ту же ошибку.

Может ли кто-нибудь помочь мне обновить это конкретное поле в строке, я не хочу предоставлять полный объект этого объекта, чтобы это произошло.

Моя сущность:

@Entity data class TableName(
    @PrimaryKey
    var id: String = "",
    @SerializedName("varOne")
    @Expose
    var varOne: List<CustomObjects>? = null)

Метод обновления выглядит примерно так:

@TypeConverters(MyTypeConverters.VarOneListTypeConverters::class)
@Query("Update TableName SET varOne = :varOneList")
abstract fun updateTableName(varOneList: List<CustomObjects>)

person skygeek    schedule 05.10.2018    source источник
comment
Вы нашли какое-нибудь решение? Я столкнулся с той же проблемой.   -  person Satya    schedule 12.10.2018
comment
То же самое и для меня. Комната кажется потрясающей LIB, но я боролся с такими глупыми вещами.   -  person Rodrigo Borba    schedule 22.10.2018
comment
Можете ли вы опубликовать свой VarOneListTypeConverters код?   -  person jguerinet    schedule 04.12.2018


Ответы (1)


В идеале вы должны попытаться смоделировать это как связь с отдельной таблицей для CustomObject и внешним ключом, относящимся к первичному ключу TableName. Однако вы все равно можете написать преобразователь для типа List<CustomObject>. Room понимает только типы данных Sqlite, и любой другой тип необходимо преобразовать в один из них. эта комната понимает. Они предоставили TypeConverter аннотации к тому же. Если вы используете Gson для сериализации вашего CustomObject, вы можете использовать следующий конвертер. Код говорит сам за себя

public class Converters {
   @TypeConverter
   public static ArrayList<String> fromString(String value) {
      Type listType = new TypeToken<ArrayList<CustomObject>>() {}.getType();
      return new Gson().fromJson(value, listType);
   }
   @TypeConverter
   public static String fromArrayList(ArrayList<CustomObject> list) {
      Gson gson = new Gson();
      String json = gson.toJson(list);
      return json;
   }
}

И вам просто нужно добавить этот конвертер в свой Database класс

@TypeConverters(Converters::class) 
abstract class YourDatabase extends RoomDatabase
person paradox    schedule 08.10.2019