我知道我可以使用代码A来接受id的参数

我希望在代码B中接受order by个参数,我应该怎么做?

你知道order by有四种方法,有以下四种:

SELECT * FROM info_table ORDER BY createdDate desc
SELECT * FROM info_table ORDER BY createdDate asc
SELECT * FROM info_table ORDER BY title desc
SELECT * FROM info_table ORDER BY title asc

Code A

@Query("SELECT * FROM info_table where id=:id")
suspend fun getByID(id:Int): RecordEntity

Code B

@Query("SELECT * FROM info_table ORDER BY createdDate desc")
fun listAll(): Flow<List<RecordEntity>>

推荐答案

基本上有三种方法可以做到这一点.

Option 1.

每个选项有4@Query个带注释的函数,然后有第五个函数,它基于参数调用这4个选项的相应函数.(option 3 uses an alternative numeric representation for the 4 options)

例如:

@Query("SELECT * FROM info_table ORDER BY createdDate desc")
fun selectOption1(): List<RecordEntity>
@Query("SELECT * FROM info_table ORDER BY createdDate asc")
fun selectOption2(): List<RecordEntity>
@Query("SELECT * FROM info_table ORDER BY createdDate desc")
fun selectOption3(): List<RecordEntity>
fun selectOption4(): Flow<List<RecordEntity>>
fun selectAppropriateOption(orderColumn: String, ifASC: Boolean): Flow<List<RecordEntity>> {
    if (orderColumn.equals("createdDate"))
        if (ifASC) {
            return selectOption2()
        } else {
            return selectOption1()
        }
    if (orderColumn.equals("title"))
        if (ifASC) {
            return selectOption4()
        } else {
            return selectOption3()
        }
    /* handle neither orderColumn????? */
    return selectOption1() /* 例如: default */
}

Option 2. using 100

有一些类似的东西:-

@RawQuery
fun rq(query: SimpleSQLiteQuery): List<RecordEntity>
fun selectViaRawQuery(orderColumn: String, ifASC: Boolean): Flow<List<RecordEntity>> {
    var orderType = " ASC "
    if (!ifASC) orderType = " DESC "
    return flow { emit(rq(SimpleSQLiteQuery("SELECT * FROM info_table ORDER BY $orderColumn $orderType"))) }
}
  • Noting该Room无法在编译时判断查询的有效性,因此出现运行时错误的可能性较大.

Option 3.

最后一种 Select 是利用大小写WHERE END构造.这answer与您的问题(2列和两种订单类型)非常相同.

例如:

@Query(
    "SELECT * FROM info_table ORDER BY " +
            "CASE WHEN :parameter = 0 THEN createdDate END DESC, " +
            "CASE WHEN :parameter = 1 THEN createdDate END ASC, " +
            "CASE WHEN :parameter = 2 THEN title END DESC, " +
            "CASE WHEN :parameter = 3 THEN title END ASC"
)
fun selectViaCase(/*childId: Int,*/ parameter: Int): Flow<List<RecordEntity>>

以上所有代码都经过了测试(编译和运行),但都是在主线程上进行的,因此没有挂起或等价的代码.

Android相关问答推荐

RippleTheme在作曲material 1.7.0中被废弃

使用Kotlin/Compose与Java/XML指南的比较

在带有REACT-Native-CLI的开发和生产中使用Firebase的最佳实践

安卓喷气背包组成倒计时动画

Jetpack编写错误(java.lang.NoSuchMethodError:无接口方法startRestartGroup)

Visual Studio 2022,毛伊岛,Android Emulator:无法更改内存量

在 Compose 中,当用户持续向下滚动时,LazyColumn 不会显示新项目

当提供非状态对象时,compose 如何进行重组

无法插入 LayoutNode@cc72396 子级,因为它已有父级

如何在 Jetpack Compose 中对数据类进行 Parcelize

将 CircularProgressIndicator 添加到按钮而不增加其高度

Android Transitions API - 在 24-48 小时后停止接收任何更新

我的 React Native 在 11 月 4 日之前运行良好,但现在在运行 yarn android 时抛出异常

Kotlin Coroutines Dispatchers.IO 没有创建预期的线程

在alert 对话框生成器中启动协程

如何在jetpack compose中创建自定义rememberState?

房间实时数据:启动时崩溃

Google Play 服务登录在 Unity Android 上无法正常运行

如何将私有 mutableStateOf 分配给 Android Jetpack 中的 State 变量?

如何获取 Material Design 3 的底部导航栏高度?