android - 带构造函数的房间类型转换器

标签 android kotlin android-room

我有 Room TypeConverter,我需要将参数注入(inject)它的构造函数

class RoomConverters(moshi Moshi) {

    @TypeConverter
    fun fromUserActionLog(data: UserActionLogModel): String {
        return moshi.adapter(UserActionLogModel::class.java).toJson(data)
    }

    @TypeConverter
    fun toUserActionLog(json: String): UserActionLogModel {
        return moshi.adapter(UserActionLogModel::class.java).fromJson(json)}
    }
}

但是当我无法使用构造函数将TypeConverter注解到数据库对象时;

@Database(entities = [SsidModel::class], version = 1, exportSchema = false)
@TypeConverters(RoomConverters::class)   
abstract class AppDatabase : RoomDatabase() {

    abstract fun ssidDao(): SsidDao
}

有什么办法可以实现吗?

最佳答案

您可以使用 2.3.0-alpha03 版本的构造函数参数创建 Room TypeConverter

发行说明:

Room now has APIs for providing instances of type converters such that the app can control their initialization. To mark a type converter that will be provided to Room use the new annotation @ProvidedTypeConverter

https://developer.android.com/jetpack/androidx/releases/room#2.3.0-alpha03

在您的情况下,您应该将 @ProvidedTypeConverter 添加到 RoomConverter

@ProvidedTypeConverter    
class RoomConverters(moshi: Moshi)

在数据库创建时创建转换器并将其传递给数据库构建器:

val roomConverter = RoomConverters(Moshi())
val db = Room.databaseBuilder()
         .addTypeConverter(roomConverter)
         .build()

您也可以使用 DI 框架,例如 Dagger 2

关于android - 带构造函数的房间类型转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53114573/

相关文章:

java - 尝试为 `coroutine`编写 `handler`模拟,但不起作用

android - 有没有办法正确模拟房间数据库?

android - 如何在 android 中使用 Room Persistence Library 查询嵌套的嵌入式对象?

java - Viewmodel 不从 Android Room 更新数据,但成功插入其中

java - onNavigationItemSelected() 问题

Android - 根用户 - 挂载 : Read-only file system

spring-boot - 当我点击 “Execute”按钮时更改Swagger UI请求URL

Android 应用程序在同一选项卡中打开浏览器?

android - 如何在android导航组件中传递参数名称?

java - 通过字节码将私有(private)类从 Kotlin 转换为 Java