起因
最近做一个需求,需要把设备(不能联外网)中埋点数据,通过局域网传给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
}
再次编译,不再报错,搞定!!!