我有一个房间TypeConverter,我需要向它的构造函数注入参数
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
}有什么方法可以做到这一点吗?
发布于 2020-11-24 01:29:49
您可以使用2.3.0-alpha03版本中的构造函数参数创建房间TypeConverter
发行说明:
房间现在有了提供类型转换器实例的app,这样应用程序就可以控制它们的初始化。要标记将提供给Room的类型转换器,请使用新注释@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框架,例如Dagger2
发布于 2019-04-10 04:39:34
我使用dagger-android,也遇到了同样的问题。解决方案是在创建AppDatabase时
@Provides @Reusable
fun provideDatabase(context: Context, moshi: Moshi): AppDatabase =
Room.databaseBuilder(...).build().apply { AppDatabase.moshi = moshi }AppDatabase是简单的RoomDatabase:
@Database(
entities = [OrderEntity::class],
version = 1,
exportSchema = false
)
@TypeConverters(DbConverters::class)
abstract class AppDatabase : RoomDatabase() {
companion object {
lateinit var moshi: Moshi
}
abstract fun orderDao(): OrderDao
}然后在converter中使用这个伴生对象:
class DbConverters {
@TypeConverter
fun orderInfoToString(orderInfo: OrderInfo?): String? =
AppDatabase.moshi.adapter(OrderInfo::class.java).toJson(orderInfo)
@TypeConverter
fun stringToOrderInfo(value: String): OrderInfo? =
AppDatabase.moshi.adapter(OrderInfo::class.java).fromJson(value)
}这看起来很丑陋,我想,但很有效。也许在@Reuseable作用域中使用静态/伴生对象不是一个好主意。不过,Moshi是使用AppModule中的@Singleton作用域提供的,因此基本上可以贯穿整个应用程序生命周期
发布于 2019-10-04 21:43:07
我查阅了文档,即使是最新的rc版本(2.2.0-rc01),但没有办法做到这一点。我认为这是一个笑话,我们不能在DatabaseBuilder中注册自定义TypeConverters,所以我在Google issue tracker上为此创建了bug。
https://stackoverflow.com/questions/53114573
复制相似问题