简体   繁体   中英

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

Using below query in 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 is a function

This Query is running successfully in SQLite db browser.

But it giving me below error while running app:

error: 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} 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}

What might be the Issue?

My SQLite version is 3.28.0 and using roomRuntime=3.2.0

There are 2 syntactical errors in your query.

The 1st is the use of the keyword DISTINCT inside the function strftime() (this is actually allowed by SQLite but does not behave like it should). Maybe you want it before the function.
The 2nd is that you use the alias e to qualify the name of the column alias name in its definition. The definition of an alias should not be qualified.

Change to this:

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;

Also, this:

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

could be simplified to:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM