基本上有三种方法可以做到这一点.
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>>
以上所有代码都经过了测试(编译和运行),但都是在主线程上进行的,因此没有挂起或等价的代码.