房间数据库 - 查询错误作为输入时没有可行的替代方案

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.

【讨论】:

最后我处理了子查询。

以上是关于房间数据库 - 查询错误作为输入时没有可行的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

ParseExpection:输入时没有可行的替代方案

Spark SQL 嵌套 JSON 错误“输入时没有可行的替代方案”

如何修复 Javadoc 注释有解析错误,详细信息:在解析 JAVADOC_TAG [NonEmptyAtClauseDescription] 时输入“*”没有可行的替代方案

Amazon Athena:输入没有可行的替代方案

在 cassandra 中输入“>”没有可行的替代方案

输入'CREATE TABLE没有可行的替代方案