房间数据库 - 查询错误作为输入时没有可行的替代方案
Posted
技术标签:
【中文标题】房间数据库 - 查询错误作为输入时没有可行的替代方案【英文标题】:Room Databse - Query Error as no viable alternative at input 【发布时间】:2021-08-25 15:43:53 【问题描述】:我在 android 中使用 Room,并在我的 dao 文件中完成如下操作:
@Query("select DISTINCT timeStamp, batteryId, status " +
"from (select batteryDetails.*, " +
"lag(status) over (partition by batteryId order by timeStamp) as oldStatus " +
"from batteryDetails) batteryDetails " +
"where status is null or oldStatus <> status")
suspend fun getHistoryEventsData(): List<BatteryDetailsHistory>?
执行上述查询时,出现以下错误:
错误:输入 '(select batteryDetails.*, lag(status) over (') 没有可行的替代方案 公共抽象 java.lang.Object getHistoryEventsData(@org.jetbrains.annotations.NotNull() ^ 无关输入 '(' 期望 , ';', K_ALTER, K_ANALYZE, K_ATTACH, K_BEGIN, K_COMMIT, K_CREATE, K_DELETE, K_DETACH, K_DROP, K_END, K_EXPLAIN, K_INSERT, K_PRAGMA, K_REINDEX, K_RELEASE, K_REPLACE, K_ROLLBACK, K_SAVEPOINT, K_SELECT, K_UPDATE、K_VACUUM、K_VALUES、K_WITH、UNEXPECTED_CHAR
查询语法可能存在一些问题。 请指导。
【问题讨论】:
查询看起来不错 我从后端得到的这个查询。将它与 Android Room 数据库一起使用。没事吧? @eshirvana 你能指导我从上面的查询中删除这个窗口函数并让它变得简单.. 查看答案 最后我处理了子查询。 【参考方案1】:如果您的 SQLite 版本不支持窗口函数,您可以将 LAG()
替换为相关子查询:
SELECT DISTINCT timeStamp, batteryId, status
FROM (
SELECT b1.*,
(
SELECT b2.status
FROM batteryDetails b2
WHERE b2.batteryId = b1.batteryId AND b2.timeStamp < b1.timeStamp
ORDER BY b2.timeStamp DESC LIMIT 1
) AS oldStatus
FROM batteryDetails b1
)
WHERE status IS NULL OR oldStatus <> status
【讨论】:
我终于处理了子查询。【参考方案2】:看起来您的 sqlite 版本不支持窗口函数,包括 LAG
,因为 android 应用程序使用 sqlite 库上的内置版本到 android 操作系统。这就是为什么 sqlite 的版本取决于 android 的 api 级别版本(应用程序运行的位置)。根据to sqlite docs(paragraph 6),窗口函数是在 3.25.0 版本中添加的,并且根据to google docs(和other answer on ***)sqlite 的窗口函数在 android 上支持,因为 android api 级别 30。
要解决 slqlite 库的碎片问题,您可以use android-requery 允许在所有 android 版本中使用最新版本的 sqlile(从 API 级别 14 开始)。好用this library with room.
【讨论】:
最后我处理了子查询。以上是关于房间数据库 - 查询错误作为输入时没有可行的替代方案的主要内容,如果未能解决你的问题,请参考以下文章
Spark SQL 嵌套 JSON 错误“输入时没有可行的替代方案”
如何修复 Javadoc 注释有解析错误,详细信息:在解析 JAVADOC_TAG [NonEmptyAtClauseDescription] 时输入“*”没有可行的替代方案