如何将List<String>和List<Object>列添加到房间数据库?

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

我正在尝试向现有房间数据库中添加两列:

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<*>
。我搜索了,不幸的是,找不到任何解决方案。

android-sqlite android-room
1个回答
0
投票

您需要使用不同的表(数据库方面的正确方式)或使用类型转换器作为值列表。

正如您所发现的,Room 只能存储一组不同的类型:-

  1. 作为文本的字符串类型。
  2. 整数类型,例如 Int、Long、Byte、Boolean .... 作为 INTEGER。
  3. 小数类型,例如 Double、Float ... as REAL。
  4. ByteStream 类型,例如 ByteArray .... 作为 BLOB。
  5. 并且 null 为 NULL(仅当没有 NOT NULL 约束时),因此不是您直接指定的类型。

不直接支持的任何其他类型(又名对象)必须在 4 种类型之一之间进行转换。因此,对于直接不受支持的类型 2,将需要 TypeConverters。 1 将对象转换为可存储类型的值,另一个在从数据库中提取数据时将值转换为对象。

两个类型转换器都是函数,并且必须使用

@TypeConverter
注释(注意单数)进行注释。

用于存储转换值的类型转换器将传递对象并返回值。

用于提取对象的类型转换器将传递值并返回对象。

包含

@TypeConverter
注解函数(类型转换器)的类需要通过
@TypeConverters
(PLURAL) 注解定义到 Room,该注解具有作用域。在
@Database
注释级别包含此注释可能是最好/最简单的。

您可能希望参考这个答案,其中包括基本类型转换器的简单示例。

但是,建议您考虑其他相关表,因为通常将列表存储为一个整体会变得复杂,很大程度上是因为不仅需要存储数据,还需要存储与描述存储对象的内容相关的膨胀。

© www.soinside.com 2019 - 2024. All rights reserved.