我有一个@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>)
答案 0 :(得分: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