如何在Room Dao函数中更新实体的TypeConverted列

问题描述 投票:6回答:1

我有一个@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.

我可以更新完整的行对象,但问题在于更新此单个字段。我在@Database类上使用TypeConverters,但是我已经尝试在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>)
android kotlin android-room typeconverter android-database
1个回答
0
投票

[理想情况下,您应该尝试将此模型建模为与CustomObject的单独表和对TableName的主键的外键引用有关的关系。但是,您仍然可以编写List<CustomObject>类型的转换器。 Room仅了解Sqlite Data types,任何其他类型都需要转换为Room可以理解的其中一种类型。他们提供了相同的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
© www.soinside.com 2019 - 2024. All rights reserved.