簡體   English   中英

Room Databse - 查詢錯誤作為輸入時沒有可行的替代方案

[英]Room Databse - Query Error as no viable alternative at input

我在 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>?

執行上述查詢時,出現以下錯誤:

錯誤:輸入'(選擇batteryDetails.*,滯后(狀態)超過('公共抽象java.lang.Object getHistoryEventsData(@org.jetbrains.annotations.NotNull(),^'extraneous input ;',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_VALUETEDSUPDATE,K_WITH,UNEXPECUETEDS }

查詢語法可能存在一些問題。 請指導。

如果您的 SQLite 版本不支持 window 函數,您可以將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

Looks like Your version of sqlite doesn't support window functions including LAG because android app use build-in version on sqlite library to android OS. 這就是為什么 sqlite 的版本取決於 android 的 api 級別版本(應用程序運行的地方)。 According to sqlite docs(paragraph 6) the window functions was added in version 3.25.0 and according to google docs (and other answer on stackoverflow) the sqlite's window functions supports on android since android api level 30.

要解決 slqlite 庫的碎片問題,您可以使用 android-requery允許在所有 android 版本中使用最新版本的 sqlile(自 API 級別 14 起)。 使用這個帶有房間的庫很容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM