Android Room Dao:按案例排序不起作用

2024-02-08

我有一个 Room 数据库,使用 Dao 来处理查询等。我使用静态(非实时数据)函数通过查询检索结果,当我手动硬编码 Order By 值和列时,一切正常,如下所示,但是在传递参数时到 Dao 进行排序时,Order By 恢复为默认值(按 id 列排序),并且不会根据传递的排序参数检索结果

硬编码 Dao 示例作品,结果按 ASC 或 DESC 排序

@Query("SELECT * FROM cameras WHERE suburb LIKE '%' || :suburb || '%' AND postcode LIKE '%' || :postcode || '%' ORDER BY direction ASC LIMIT :limit OFFSET :offset ")
fun getCamerasViaStatic(suburb: String?, postcode: String?, limit: Int?, offset: Int?): List<CamerasModel>

//and results retrieved in fragment using

CamerasApplicationDatabase.getInstance(context!!).CamerasDao().getCamerasViaStatic("", "", limit, offset)

传递给 Dao 示例的排序参数不起作用,结果按默认排序

@Query("SELECT * FROM cameras WHERE suburb LIKE '%' || :suburb || '%' AND postcode LIKE '%' || :postcode || '%' ORDER BY :sort_by ASC LIMIT :limit OFFSET :offset ")
fun getCamerasViaStatic(suburb: String?, postcode: String?, limit: Int?, offset: Int?, sort_by: String): List<CamerasModel>

//and results retrieved in fragment using

var sort_by = "my_column_to_sort_by"
CamerasApplicationDatabase.getInstance(context!!).CamerasDao().getCamerasViaStatic("", "", limit, offset, sort_by)

不知道为什么这个添加不起作用,考虑到传递的其他参数在两个示例中仍然有效,问题是,稍后我传递 ASC/DESC 参数并在 CASE WHEN 中使用(下面的示例)

ORDER BY CASE WHEN :sort = 1 THEN :sort_by END ASC, CASE WHEN :sort = 0 THEN :sort_by END DESC

找到使用多个 CASE 表达式的解决方案...解决方案从以下链接中得到帮助

房间用户可通过查询配置订单 https://stackoverflow.com/questions/50104554/room-user-configurable-order-by-queries#

房间数据库全动态查询 https://stackoverflow.com/questions/48172807/room-database-full-dynamic-query/48173542#48173542

@Query("SELECT * FROM cameras " +
        "WHERE suburb LIKE '%' || :suburb || '%' AND postcode LIKE '%' || :postcode || '%' " +
        "ORDER BY " +
        "CASE WHEN :sort_by = 'description'  AND :sort = 0 THEN description END DESC, " +
        "CASE WHEN :sort_by = 'description'  AND :sort = 1 THEN description END ASC, " +
        "CASE WHEN :sort_by = 'direction'    AND :sort = 0 THEN direction   END DESC, " +
        "CASE WHEN :sort_by = 'direction'    AND :sort = 1 THEN direction   END ASC, " +
        "CASE WHEN :sort_by = 'location'     AND :sort = 0 THEN locality    END DESC, " +
        "CASE WHEN :sort_by = 'location'     AND :sort = 1 THEN locality    END ASC, " +
        "CASE WHEN :sort_by = 'state'        AND :sort = 0 THEN state       END DESC, " +
        "CASE WHEN :sort_by = 'state'        AND :sort = 1 THEN state       END ASC " +
        "LIMIT :limit " +
        "OFFSET :offset "
)

fun getCamerasUsingPaginationStatic(suburb: String?, postcode: String?, limit: Int?, offset: Int?, sort: Int?, sort_by: String?): List<CamerasModel>

下面也是相同的查询类型,但如果您需要根据 id/值/等数组过滤结果,则传递 ids 数组(使用 IN(:filteredBookmarkedItems))...

@Query("SELECT * FROM cameras " +
        "WHERE camera_id IN(:filteredBookmarkedItems) AND suburb LIKE '%' || :suburb || '%' AND postcode LIKE '%' || :postcode || '%' " +
        "ORDER BY " +
        "CASE WHEN :sort_by = 'description'  AND :sort = 0 THEN description END DESC, " +
        "CASE WHEN :sort_by = 'description'  AND :sort = 1 THEN description END ASC, " +
        "CASE WHEN :sort_by = 'direction'    AND :sort = 0 THEN direction   END DESC, " +
        "CASE WHEN :sort_by = 'direction'    AND :sort = 1 THEN direction   END ASC, " +
        "CASE WHEN :sort_by = 'location'     AND :sort = 0 THEN locality    END DESC, " +
        "CASE WHEN :sort_by = 'location'     AND :sort = 1 THEN locality    END ASC, " +
        "CASE WHEN :sort_by = 'state'        AND :sort = 0 THEN state       END DESC, " +
        "CASE WHEN :sort_by = 'state'        AND :sort = 1 THEN state       END ASC " +
        "LIMIT :limit " +
        "OFFSET :offset "
)
fun getBookmarkedCamerasUsingPaginationStatic(filteredBookmarkedItems: List<Int>, suburb: String?, postcode: String?, limit: Int?, offset: Int?, sort: Int?, sort_by: String?): List<CamerasModel>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Room Dao:按案例排序不起作用 的相关文章

随机推荐

  • Typescript:TSX 文件在 Chrome 中显示为空白

    当尝试在 Google Chrome 中调试 TypeScript 应用程序时 ts 文件在检查器中正确进行源映射 但 tsx 文件显示完全为空 这并不能真正帮助我调试它们 如何正确地将 tsx 文件获取到源映射 我建议您尝试为使用的 We
  • PYTHON 使用退出键退出时出现问题

    我在使用以下代码时遇到问题 它似乎对退出键有反应 但它冻结得很厉害 我将 pyscripter 与 python 2 7 和 pygame 一起使用 An example implementation of the algorithm de
  • React createElement 与 CloneElement

    谁能告诉我如果使用cloneElement 在现有元素实例上 或createElement 在react Element类上 哪一个在性能方面更好 有时克隆某些东西比创建新实例更快 请告诉我 谢谢 Using cloneElement通常会
  • ASP.NET MVC 3 DropDownList 选定索引已更改

    我有一项功能 允许用户根据自己的状态代码过滤记录 在菜单中 我有一个自定义过滤器部分 h3 Custom Filters h3 br ul Html RenderAction GetGroups Manage ul 我的部分视图如下所示 m
  • ReplayKit 在应用程序的后台模式或应用程序外部停止屏幕录制?

    我已经在应用程序的前台模式下使用 ReplayKit 实现了屏幕录制 但是 当我使用主页按钮离开应用程序时 应用程序会停止后台记录 gt App Store 中有一个可以进行后台屏幕录制的应用程序 gt 如果我必须使用广播上传和 UI 扩展
  • 简单地将 Entity Framework Core 添加到基本 Azure 函数应用程序会导致错误

    描述起来非常简单 使用 Visual Studio 2019 16 4 1 中的 Azure Functions 模板创建新的解决方案 将 TargetFramework 更改为 NET Core 3 1 它将使用 Microsoft NE
  • 如何加载依赖程序集?

    我有一个项目处理器 它依赖于其他 2 个项目 当我编译项目时 我在 Bin 文件夹中得到 dll Processor dll 和其他项目的依赖 dll Processor dll BusinessAction dll 和 Repositor
  • Spring实际上是否使用REQUIRES_NEW启动一个新事务?

    我的 spring 4 1 1 应用程序部署在 JBoss 6 10 final 实例上 因此它使用基于容器的事务管理器和数据源 对于消息传递 我使用 TIBCO EMS 8 1 并设置了 XA 队列连接工厂 Java版本是1 8 0 20
  • ctrl-d 没有停止 while(getchar()!=EOF) 循环[重复]

    这个问题在这里已经有答案了 Here is my code I run it in ubuntu with terminal when I type a CtrlD in terminal the program didn t stop b
  • ASP .NET MVC 3 - 如何提交嵌套在 html 表单中的 ajax 表单

    我有一个 ASP NET MVC 3 项目 并且我的 创建 视图之一存在问题 我有使用 ajax 表单实现的级联下拉字段 粗略地说 该视图是这样的 using Html BeginForm Html MyDropDown1 using Aj
  • 在 Linux 上安装 nloptr

    我正在尝试安装 R 包nloptr在没有互联网连接的 CentOS Linux 机器上 如下所示 install packages home ravi nloptr 1 0 4 tar gz repos NULL type source 该
  • 函数内声明的 const 数组是否存储在堆栈中?

    如果这是在函数中声明的 它会在堆栈上声明吗 它是 const 让我想知道 void someFunction const unsigned int actions 8 e1 e2 etc 是的 它们在堆栈上 您可以通过查看此代码片段来了解这
  • SAP B1,如何显示从 ItemImage 获取的图像?

    我正在从 SAP B1 服务层获取图像 在邮递员中 我可以将其视为image png 但显示它时出现问题 正确的显示方式是什么 img require fetchedImage 不起作用 我创建了一个云函数来获取图像并将其传递给客户端 但我
  • 以编程方式设置 LinearLayout 分隔线大小

    我已经尝试了多种解决方案 但似乎没有一个有效 我目前正在使用以下Drawable作为分隔线 这是水平示例 但相同的方法也适用于垂直 将高度切换为宽度 LinearLayout linearLayout set with findViewBy
  • 使用 ?与 sed

    我只想获取可能经过 gzip 压缩或未经过 gzip 压缩的文件的编号 但是 sed 中的正则表达式似乎不支持 这是我尝试过的 echo file 1 gz sed n s gz 1 p 并没有返回任何东西 然后我添加了一个 到正在分析的字
  • Julia:矢量化代码与非矢量化代码

    据我了解 Julia 应该使 for 循环更快 并且与矢量化操作一样快 我编写了一个简单函数的三个版本 该函数使用 for 循环与矢量化操作与后者使用 DataFrame 来查找距离 x rand 500 y rand 500 a rand
  • YouTube 数据 API 每日最大查询配额已降至 0,且无法设置任何数字

    我们的项目每天的查询配额限制突然降至 0 Google 没有任何解释 我们正在为我们的项目使用 YouTube Data API 并且即将发布该应用程序 因此我们要求 YouTube 增加每天的查询配额限制 然而 三天后就降为0 没有任何明
  • ag-grid 使用单个 gridOptions 在同一页面中多个实例

    我在我的应用程序中使用 ag grid 我想在同一页面上使用具有两个网格的网格选项的相同实例 ag grid 仅渲染其中一个网格 而将另一个网格留空 这个 plnkr 显示了这个问题 http plnkr co edit 4rRNRGbUo
  • 在延迟加载模块中使用 Angular 组件

    我想在应用程序的多个部分中使用 Angular 组件 包括在延迟加载模块内的组件中 我不知道如何声明在惰性模块中使用它的组件 我将向您展示不同文件的一些相关部分 应用程序模块 ts import FpgTimeComponent from
  • Android Room Dao:按案例排序不起作用

    我有一个 Room 数据库 使用 Dao 来处理查询等 我使用静态 非实时数据 函数通过查询检索结果 当我手动硬编码 Order By 值和列时 一切正常 如下所示 但是在传递参数时到 Dao 进行排序时 Order By 恢复为默认值 按