【发布时间】:2018-04-25 05:51:42
【问题描述】:
我已经使用 Kotlin 的 typealias 定义了一个 E164 电话号码类型:
typealias E164 = String
这让我在代码中传递电话号码时的意图更加清晰,而不仅仅是传递字符串。我承认没有实际强制使用正确的类型,但这对我来说效果很好。
现在我想将 E164 存储在 Android Room 数据库中。这在没有 typealias 的情况下工作,但使用 typealias 它需要一个 TypeConverters。我试过这个:
@Entity data class MyModel(@PrimaryKey val e164: E164, val someOtherThing: String)
class E164Converters {
@TypeConverter
fun toE164(value: String): E164 = value
@TypeConverter
fun toString(e164: E164): String = e164
}
编译器不喜欢 E164Converters 类的自动生成的 Java,因为 toString 和 toE164 方法都定义了相同的 String -> String 转换。
error: Multiple methods define the same conversion. Conflicts with these: CustomTypeConverter(type=E164Converters, method=toString(java.lang.String), from=java.lang.String, to=java.lang.String) public final java.lang.String toE164(@org.jetbrains.annotations.NotNull()
但是如果我不定义 TypeConverters,那么编译器不知道如何将 E164 放入数据库:
error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
private final error.NonExistentClass e164 = null;
有人知道如何实现吗?
【问题讨论】:
标签: kotlin android-room