如何在 Room @Query 中使用 ROW_NUMBER()?

Posted

技术标签:

【中文标题】如何在 Room @Query 中使用 ROW_NUMBER()?【英文标题】:How use ROW_NUMBER() in Room @Query? 【发布时间】:2020-07-31 22:05:21 【问题描述】:

问题:

我在我的应用程序中点击了api,它在页面中发送日期(页面大小 = 20)。所以目前我正在尝试使用 ROOM 将数据保存在我的本地数据库中,这是一个基本的插入操作。当应用程序未连接到网络我希望应用程序以页面的形式从 db 获取数据。

解决方案(我尝试过的):

DAO第i层内使用

 @Query("SELECT * FROM ( SELECT ROW_NUMBER () OVER ( ORDER BY rating ) RowNum,* FROM movie ) t WHERE t.RowNum > 0 AND t.RowNum <= 20")
 suspend fun getPagedMovie(): List<MovieEntity>

我收到两个编译错误:

、FROM、GROUP、LIMIT、ORDER、WHERE 或逗号,

&

无法重新喜欢 t.RowNum

所以,为了解决这个问题,我尝试使用 @RawQuery

val query = SimpleSQLiteQuery(
        "SELECT * FROM ( SELECT ROW_NUMBER () OVER ( ORDER BY rating ) RowNum,* FROM movie ) t WHERE t.RowNum > 0 AND t.RowNum <= 20"
    )
return movieDao.getPagedMovie(query).map  it.toGeneralMovie() 

&

 @RawQuery
 suspend fun getPagedMovie(query: SupportSQLiteQuery): List<MovieEntity>

在上述情况下,我的错误日志如下:

2020-04-18 16:23:33.014 21854-21854/? E/m.andor.watchi:runtime_flags 中设置的未知位:0x8000 2020-04-18 16:23:34.158 21854-21891/com.andor.watchit E/[Gralloc-ERROR]: sanitize_formats:482 不支持 afbc 的格式 [id:0x4] 不应定义 bpp 2020-04-18 16:23:34.415 21854-21979/com.andor.watchit E/SQLiteLog: (1) 靠近 "(": 语法错误 2020-04-18 16:23:34.456 21854-21978/com.andor.watchit E/androidRuntime: 致命异常: DefaultDispatcher-worker-3 进程:com.andor.watchit,PID:21854 android.database.sqlite.SQLiteException: near "(": syntax error (code 1 SQLITE_ERROR[1]): , while compile: SELECT * FROM (SELECT ROW_NUMBER () OVER (ORDER BY rating) RowNum,* FROM movie) t WHERE t.RowNum > 0 AND t.RowNum

我想知道使用 ROOM 实现分页的解决方案?

附: :我的查询现在只是获取第一个 20 元素,即第一页,我可以稍后在 DB Browser 上使其成为动态查询。在旁注中,我不想加载整个结果然后制作页面。

【问题讨论】:

你能像这里一样使用跳过和采取机制吗:***.com/a/13221574/2514250 感谢以上我确实找到了 LIMIT 和 OFFSET 的解决方案并用作解决方案是 gng 在这里发布@dev-masih 但是,如果我能用 row_number 获得解决方案,那就太好了。当前的解决方案是正确的,但我认为 row_number 解决方案也让我感兴趣。 我添加了一个带有 ROW_NUMBER 的解决方案 【参考方案1】:

我通过使用LIMITOFFSET找到了上述问题的解决方案

@Query("SELECT * FROM movie ORDER BY rating DESC LIMIT :pageSize OFFSET (:pageNumber-1)*:pageSize")
suspend fun getPagedMovie(pageNumber: Int, pageSize: Int): List<MovieEntity>

希望这也能帮助其他人。

也感谢@dev-masih 在评论中提供参考。

【讨论】:

太棒了.. 了解更多关于 LIMIT & OFFSET 的信息。你可以看看this answer

以上是关于如何在 Room @Query 中使用 ROW_NUMBER()?的主要内容,如果未能解决你的问题,请参考以下文章

Room - 如何从 DAO 查询中获取 COUNT 值?

石榴的东西

Room 查询中的“=”和“==”有啥区别?

Android Room Persistence Library - 如何查找 ID 列表中包含 ID 的实体?

为啥此查询可以在 Android Studio 中的 App Inspection 的 Database Inspector 部分工作,但不能在 Room Query 中工作?

Android Room 不确定如何将光标转换为方法的返回类型问题