在 Room 中编写一个类型安全的查询,根据某个枚举值进行选择

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 值而不是枚举。

dha*_*rms 5

您可以有一个简单的方法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)