Jetpack系列之Room中存Map结构

起因

最近做一个需求,需要把设备(不能联外网)中埋点数据,通过局域网传给App,然后App再上传到埋点平台,我给出的方案是,把产生的每一条埋点都存入数据库,然后App择机读取的时候,设备这边读取数据库返回json串,App端拿到数据后,进行SDK埋点。

干活

建表,事件名,参数,时间戳,所以实体类如下:

@Entity(tableName = "app_point_log")
data class AppPointLogEntity(
  var eventName: String,
  var eventParams: Map<String, String>,
  var timeStamp: Long
) {
  @PrimaryKey(autoGenerate = true)
  @ColumnInfo(name = "id")
  var id: Long = 0
}

接着写DAO以及Repository层,这里就不赘述了。写好之后,手动点击编译,报错如下:

错误: Cannot figure out how to save this field into database. You can consider adding a type converter for it. - eventParams in com.xxxx.libdomain.data.point.AppPointLogEntity
错误: Cannot figure out how to read this field from a cursor. - eventParams in com.xxxx.libdomain.data.point.AppPointLogEntity

意思够明白吧,建议添加一个converter
这个Converter如下:

class MapTypeConverter {

    @TypeConverter
    fun stringToMap(value: String): Map<String, String> {
        return Gson().fromJson(value, object : TypeToken<Map<String, String>>() {}.type)
    }
    @TypeConverter
    fun mapToString(value: Map<String, String>?): String {
        return if (value == null) "" else Gson().toJson(value)
    }
}

写完之后,必须记得,把它加在这个地方

@Database(entities = [AppPointLogEntity::class], version = 1, exportSchema = false)
@TypeConverters(MapTypeConverter::class)
abstract class AppDatabase : RoomDatabase() {
   abstract fun appPointLogDao(): AppPointLogDao
}

再次编译,不再报错,搞定!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值