如何在 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】:我通过使用LIMIT
和OFFSET
找到了上述问题的解决方案
@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()?的主要内容,如果未能解决你的问题,请参考以下文章
Android Room Persistence Library - 如何查找 ID 列表中包含 ID 的实体?
为啥此查询可以在 Android Studio 中的 App Inspection 的 Database Inspector 部分工作,但不能在 Room Query 中工作?