I have Room TypeConverter and I need to inject parameter to it's constructor
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)}
}
}
But when I can not annotate TypeConverter to database object with contructor;
@Database(entities = [SsidModel::class], version = 1, exportSchema = false)
@TypeConverters(RoomConverters::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun ssidDao(): SsidDao
}
Is there any way to achieve this?
解决方案
You can create Room TypeConverter with constructor parameters from version 2.3.0-alpha03
Release notes:
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
In your case you should add @ProvidedTypeConverter to RoomConverter
@ProvidedTypeConverter
class RoomConverters(moshi: Moshi)
Create converter at db creation time and pass it to database builder:
val roomConverter = RoomConverters(Moshi())
val db = Room.databaseBuilder()
.addTypeConverter(roomConverter)
.build()
Also you can use DI framework e.g. Dagger2