【问题标题】:How do I set up a room database with an array of data class如何使用一组数据类设置房间数据库
【发布时间】:2021-11-01 04:12:57
【问题描述】:

我需要为离线缓存设置一个房间数据库。我需要它是这种格式。

class House : ArrayList<HouseItem>()

data class HouseItem(
val actor: String,
val house: String,
val image: String,
val name: String )

我需要它,所以我可以检索房屋类型并将其放入

    var houseLiveData : MutableLiveData<House>  = MutableLiveData()

【问题讨论】:

  • 我需要它,所以我可以检索 House 的房屋类型,你想从 Room 数据库中插入和检索 HouseItem 的列表吗?
  • 你为什么不做 var houseLiveData : MutableLiveData> = MutableLiveData()

标签: android kotlin android-room


【解决方案1】:

由于表中的列必须是单一类型而不是数组/列表/集合等,因此您需要一个使用单一类型的实体。

为了使该类成为一个表,则使用 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 级别,则范围适用于该类,如果在字段/变量级别,则范围适用于该字段。

  • @TypeConvereters 也可以在 DAO 类中进行编码。有关全面信息,请参阅 TypeConverters。

@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 来提取适当的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 2021-11-18
    相关资源
    最近更新 更多