使用Kotlin typealias定义E164类型后,Android Room需TypeConverters的问题
解决Kotlin Typealias E164在Android Room中的存储问题
嘿,用typealias给String做语义化包装确实能让代码表意清晰太多了!针对你在Room里存储E164类型的需求,咱们只需要写个简单的TypeConverter就能搞定,具体步骤如下:
1. 编写E164类型转换器
因为E164本质就是编译期的String别名,运行时Room还是把它当String处理,所以转换器逻辑非常直接:
class E164TypeConverters { // 把E164转成Room能存储的String @TypeConverter fun fromE164(e164: E164?): String? { return e164 } // 把从数据库读出的String转成E164类型 @TypeConverter fun toE164(string: String?): E164? { // 这里可选:如果想做简单校验,可以加个正则判断合法的E164格式 // 比如:return string?.takeIf { it.matches(Regex("^\\+[1-9]\\d{1,14}$")) }?.let { E164(it) } return string?.let { E164(it) } } }
2. 告诉Room使用这个转换器
你可以在Room的Database类上添加@TypeConverters注解,这样整个数据库的Entity和Dao都能自动使用这个转换器:
@Database(entities = [MyModel::class], version = 1) @TypeConverters(E164TypeConverters::class) abstract class AppDatabase : RoomDatabase() { abstract fun myModelDao(): MyModelDao }
当然,如果你只想让某个Entity或者Dao用这个转换器,也可以把注解加在对应的类上。
3. 在Entity中正常使用E164类型
现在你的Entity就可以直接用E164作为字段类型了,Room会自动处理转换:
@Entity data class MyModel( @PrimaryKey val id: Int, val contactPhone: E164 // 直接用E164,表意清晰又能正常存储 )
额外小建议
虽然typealias本身没有强制校验,但你可以在toE164方法里加上E164格式的正则校验(比如匹配^\+[1-9]\d{1,14}$这样的规则),这样能确保存入数据库的都是合法格式的电话号码,进一步提升数据的可靠性。
内容的提问来源于stack exchange,提问作者NickB
相关产品推荐
相关产品推荐

