【问题标题】:How can I update a TypeConverted column of an entity in Room Dao function如何在 Room Dao 函数中更新实体的 TypeConverted 列
【发布时间】:2019-03-10 19:07:31
【问题描述】:

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

【问题讨论】:

  • 您找到解决方案了吗?我也面临同样的问题。
  • 对我来说也一样。 Room 似乎是一个了不起的 LIB,但我一直在为这种愚蠢的事情苦苦挣扎。
  • 你能发布你的VarOneListTypeConverters代码吗?

标签: android kotlin android-room typeconverter android-database


【解决方案1】:

理想情况下,您应该尝试将此建模为与CustomObject 的单独表和TableName 主键的外键引用的关系。 但是,您仍然可以为List&lt;CustomObject&gt; 类型编写转换器。 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多