由于表中的列必须是单一类型而不是数组/列表/集合等,因此您需要一个使用单一类型的实体。
为了使该类成为一个表,则使用 Room @Entity 注释。
所以你可以有一个类,例如:-
@Entity
data class AltHouseEntity(
@PrimaryKey
val houses: House
)
但是,由于 Room 只能存储特定的有限对象类型,House 不是其中之一,因此您需要有 TypeConvereters 来转换 House 为可以存储的类型之一。最合适的类型可能是字符串,而该字符串可能是 JSON 字符串。
为了配合上述课程,您将拥有另一个定义/编码转换函数/方法的课程。
每个对象需要 2 个方法。一种用于添加/更新数据,允许从 Object 转换为存储的类型,另一种用于提取数据,将存储的类型转换为 Object。
此类函数需要用@TypeConverter注解,类需要通过@TypeConverters注解定义(**注意两个注解之间的拼写差异即一个是单数另一个是复数)。
所以你可以有一个类,例如:-
class HouseConverters {
@TypeConverter
fun convertFromHouseToJSONString(houseToConvert: House): String {
return Gson().toJson(houseToConvert)
}
@TypeConverter
fun convertFromJSOnStringToHouse(jsonToConvert: String): House {
return Gson().fromJson(jsonToConvert, House::class.java)
}
}
- 再次注意单数
@TypeConverter 而不是 @TypeConverters
最后你需要使用@TypeConverters(复数)注解来定义TypeConverter 类。 TypeConverter 类的范围由@TypeConverters 注解的位置决定。
如果它被放置在@Database/Database 级别,那么 TypeConverters 的范围是整个数据库。如果在@Entity 级别,则范围适用于该类,如果在字段/变量级别,则范围适用于该字段。
@Database 范围适用于许多情况,因此包含 @Database 注释的数据库类可以包含上述内容:-
@Database(entities = [AltHouseEntity::class],version = 1)
@TypeConverters(HouseConverters::class)
abstract class TheDatabase: RoomDatabase() { ....
- 即:-
-
AltHouseEntity 类通过 @Database 注释的实体属性指定为表。
-
HouseConverters 类在@Database/Database 级别定义,因此具有整个数据库的范围。
如果定义了 AltHouseEntity,则使用上述方法,例如,使用:-
val ahouse1 = AltHouseEntity(houses = House())
ahouse1.houses.addAll(
listOf(
HouseItem(
actor = "Fred",
house = "house1",
image = "theimageforItem1",
name = "Item1"
),
HouseItem(
actor = "Mary",
house = "house1",
image = "theimageforItem2",
name = "Item2"
)
)
)
然后将其存储在 AltHouseEntity 表中为:-
然后您需要一个合适的@Query 来提取适当的数据。