首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带构造器的房间TypeConverter

带构造器的房间TypeConverter
EN

Stack Overflow用户
提问于 2018-11-02 15:47:35
回答 5查看 2.2K关注 0票数 11

我有一个房间TypeConverter,我需要向它的构造函数注入参数

代码语言:javascript
复制
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标注到数据库对象时;

代码语言:javascript
复制
@Database(entities = [SsidModel::class], version = 1, exportSchema = false)
@TypeConverters(RoomConverters::class)   
abstract class AppDatabase : RoomDatabase() {

    abstract fun ssidDao(): SsidDao
}

有什么方法可以做到这一点吗?

EN

回答 5

Stack Overflow用户

发布于 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

代码语言:javascript
复制
@ProvidedTypeConverter    
class RoomConverters(moshi: Moshi)

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

代码语言:javascript
复制
val roomConverter = RoomConverters(Moshi())
val db = Room.databaseBuilder()
         .addTypeConverter(roomConverter)
         .build()

你也可以使用DI框架,例如Dagger2

票数 10
EN

Stack Overflow用户

发布于 2019-04-10 04:39:34

我使用dagger-android,也遇到了同样的问题。解决方案是在创建AppDatabase时

代码语言:javascript
复制
@Provides @Reusable
fun provideDatabase(context: Context, moshi: Moshi): AppDatabase = 
    Room.databaseBuilder(...).build().apply { AppDatabase.moshi = moshi }

AppDatabase是简单的RoomDatabase:

代码语言:javascript
复制
@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中使用这个伴生对象:

代码语言:javascript
复制
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作用域提供的,因此基本上可以贯穿整个应用程序生命周期

票数 2
EN

Stack Overflow用户

发布于 2019-10-04 21:43:07

我查阅了文档,即使是最新的rc版本(2.2.0-rc01),但没有办法做到这一点。我认为这是一个笑话,我们不能在DatabaseBuilder中注册自定义TypeConverters,所以我在Google issue tracker上为此创建了bug。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53114573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档