Тип комнатыКонвертер с конструктором - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть Room 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
}

Есть ли способ добиться этого?

1 Ответ

0 голосов
/ 09 апреля 2019

Я пользуюсь dagger-android, и столкнулся с такой же проблемой. Решение заключается в создании базы данных приложений

@Provides @Reusable
fun provideDatabase(context: Context, moshi: Moshi): AppDatabase = 
    Room.databaseBuilder(...).build().apply { AppDatabase.moshi = moshi }

База данных приложений проста 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
}

Затем используйте этот сопутствующий объект в конвертере:

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, тем не менее, предоставляется с использованием @Singleton scope в AppModule, так что в основном живут всю жизнь приложения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...