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

8
我有一个 @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和update函数本身上使用它们,但报告了相同的错误。

有人能帮助我更新此特定字段吗?我不想提供此实体的完整对象来完成此操作。

我的实体是:

@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>)

1
你找到任何解决方案了吗?我也遇到了同样的问题。 - Satya
对我来说也是一样。Room 看起来是一个很棒的库,但我一直在处理一些愚蠢的事情。 - Rodrigo Borba
你能发布一下你的 VarOneListTypeConverters 代码吗? - jguerinet
2个回答

2
理想情况下,您应该尝试将其建模为与TableName的主键具有外键引用的CustomObject的单独表关系。但是,您仍然可以为类型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

0

您可以直接插入字符串。Typeconverter 似乎无法与 Update 查询一起使用。

@Query("Update TableName SET varOne = :varOneList")
abstract fun updateTableName(varOneList: String)

当您调用此方法时,请手动进行转换

tableDao.updateTableName(Gson().toJson(varOneList))

在这里我使用Gson进行转换,您可以在您的转换器类中使用任何您想用的东西。

理想情况下,您应该构建您的表格,以便您不必将一个列表作为字符串插入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接