我正在尝试向现有房间数据库中添加两列:
execSQL("ALTER TABLE table ADD COLUMN cars List<Car>") // -> var cars: List<Car> = listOf()
execSQL("ALTER TABLE table ADD COLUMN fuel List<String>") // var fuel: List<String> = listOf()
我知道如何处理
String
和 Integer
,但不知道如何处理 List<*>
。我搜索了,不幸的是,找不到任何解决方案。
您需要使用不同的表(数据库方面的正确方式)或使用类型转换器作为值列表。
正如您所发现的,Room 只能存储一组不同的类型:-
不直接支持的任何其他类型(又名对象)必须在 4 种类型之一之间进行转换。因此,对于直接不受支持的类型 2,将需要 TypeConverters。 1 将对象转换为可存储类型的值,另一个在从数据库中提取数据时将值转换为对象。
两个类型转换器都是函数,并且必须使用
@TypeConverter
注释(注意单数)进行注释。
用于存储转换值的类型转换器将传递对象并返回值。
用于提取对象的类型转换器将传递值并返回对象。
包含
@TypeConverter
注解函数(类型转换器)的类需要通过 @TypeConverters
(PLURAL) 注解定义到 Room,该注解具有作用域。在 @Database
注释级别包含此注释可能是最好/最简单的。
您可能希望参考这个答案,其中包括基本类型转换器的简单示例。
但是,建议您考虑其他相关表,因为通常将列表存储为一个整体会变得复杂,很大程度上是因为不仅需要存储数据,还需要存储与描述存储对象的内容相关的膨胀。