4ca*_*tle 1 enums android kotlin android-room
在 Kotlin Android 项目中,我想要一个 Room 查询,在其中我选择数据库表中的记录,其中一个字段具有某个枚举值。Room 通过TypeConverter将它们转换为Int值来运行它们来存储我的枚举值。
这是我的Entity:
@Entity(tableName = "users")
class User(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
@TypeConverters(UserType.Converter::class)
val type: UserType
)
enum class UserType {
Free,
Trial,
Paying;
object Converter {
@TypeConverter
fun toInt(userType: UserType): Int = userType.ordinal
@TypeConverter
fun fromInt(int: Int): UserType = values()[int]
}
}
Run Code Online (Sandbox Code Playgroud)
这是我想写的查询:
@Dao
interface UserDao {
@Query("SELECT * FROM users WHERE type = ${UserType.Trial.ordinal}")
suspend fun getTrialUsers(): Array<User>
}
Run Code Online (Sandbox Code Playgroud)
该代码的问题在于 Kotlin 要求Query注释的参数是编译时常量,但ordinal枚举的值不被视为编译时常量。什么是类型安全的解决方法?目前,我正在考虑的非类型安全解决方法是使用constint 值而不是枚举。
您可以有一个简单的方法getUsers(type)来执行包含更好的界面的查询getTrialUsers()。
@Dao
abstract class UserDao {
@Query("SELECT * FROM users WHERE type = :type")
protected abstract suspend fun getUsers(type: Int): Array<User>
suspend fun getTrialUsers(): Array<User> = getUsers(UserType.Trial.ordinal)
}
Run Code Online (Sandbox Code Playgroud)