簡體   English   中英

錯誤:無關的輸入“。” 期待 {,在 Android 房間查詢

[英]error: extraneous input '.' expecting {, in Android Room Query

在 Android Room 中使用以下查詢:

 @Query(
     "SELECT strftime ('%d-%m-%Y', datetime(DISTINCT timeStamp, 'unixepoch', 'localtime')) AS e.name " +
             "FROM (SELECT batteryDetails.*, " +
             "COUNT(logId) OVER" +
             "(PARTITION BY batteryId) AS oldStatus " +
             "from batteryDetails) batteryDetails " +
             "LEFT JOIN eventTypes e ON e.eventType = batteryDetails.status " +
             "WHERE oldStatus is null OR oldStatus <> status AND batteryId = :batteryId AND " +
             "timeStamp between :startDate AND :endDate " +
             "ORDER BY timeStamp DESC"
 )
suspend fun getHistoryEventsData(
    batteryId: String,
    startDate: String,
    endDate: String
): List<String>?

getHistoryEventsData是 function

此查詢在 SQLite 數據庫瀏覽器中成功運行。

但它在運行應用程序時給了我以下錯誤:

錯誤:無關的輸入“。” 期待 {, ';', 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_WITH, UNEXPECTED_CHAR} public abstract java.lang.Object getHistoryEventsData(@org.jetbrains.annotations.NotNull() ^ extraneous input '(' expecting {, ';', 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}

可能是什么問題?

我的 SQLite 版本是 3.28.0 並使用 roomRuntime=3.2.0

您的查詢中有 2 個語法錯誤。

第一個是在 function strftime()中使用關鍵字DISTINCT (這實際上是 SQLite 允許的,但行為不應該像它應該的那樣)。 也許您在 function 之前想要它。
第二個是您使用別名e在其定義中限定列別名的name 別名的定義不應被限定。

改成這樣:

SELECT DISTINCT strftime('%d-%m-%Y', datetime(timeStamp, 'unixepoch', 'localtime')) AS name 
FROM (
  SELECT batteryDetails.*, 
         COUNT(logId) OVER(PARTITION BY batteryId) AS oldStatus 
  from batteryDetails
) batteryDetails 
LEFT JOIN eventTypes e ON e.eventType = batteryDetails.status 
WHERE oldStatus is null OR oldStatus <> status 
  AND batteryId = :batteryId 
  AND timeStamp between :startDate AND :endDate 
ORDER BY timeStamp DESC;

另外,這個:

strftime('%d-%m-%Y', datetime(timeStamp, 'unixepoch', 'localtime'))

可以簡化為:

strftime('%d-%m-%Y', timeStamp, 'unixepoch', 'localtime')

暫無
暫無

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

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