Как использовать ROW_NUMBER () в Room @Query? - PullRequest
0 голосов
/ 18 апреля 2020

Проблема:

Я нажимаю api в моем приложении, которое отправляет дату в страницах (размер страницы = 20). В настоящее время я пытаюсь сохранить данные в моем локальном БД, используя ROOM, который это базовая c операция вставки. И когда приложение не подключено к сети, я хочу, чтобы приложение получало данные из БД в виде страниц.

Решение (что я пробовал):

Внутри DAO layer i, используя

 @Query("SELECT * FROM ( SELECT ROW_NUMBER () OVER ( ORDER BY rating ) RowNum,* FROM movie ) t WHERE t.RowNum > 0 AND t.RowNum <= 20")
 suspend fun getPagedMovie(): List<MovieEntity>

Я получаю две ошибки компиляции:

<составной оператор>, FROM, GROUP, LIMIT, ORDER, WHERE или запятая ожидается,

&

не может восстановить t.RowNum

Так, чтобы решить эту проблему, я попытался использовать @RawQuery

val query = SimpleSQLiteQuery(
        "SELECT * FROM ( SELECT ROW_NUMBER () OVER ( ORDER BY rating ) RowNum,* FROM movie ) t WHERE t.RowNum > 0 AND t.RowNum <= 20"
    )
return movieDao.getPagedMovie(query).map { it.toGeneralMovie() }

&

 @RawQuery
 suspend fun getPagedMovie(query: SupportSQLiteQuery): List<MovieEntity>

В вышеприведенном случае я получаю ниже в журнале ошибок:

2020-04-18 16: 23: 33.014 21854-21854 /? E / m.andor.watchi: неизвестные биты, установленные в флагах времени выполнения: 0x8000 2020-04-18 16: 23: 34.158 21854-21891 / com.andor.watchit E / [Grallo c -ERROR]: sanitize_formats: 482 Формат [ id: 0x4], который не поддерживает afb c, не должен иметь bpp, определенный 2020-04-18 16: 23: 34.415 21854-21979 / com.andor.watchit E / SQLiteLog: (1) вблизи "(": синтаксис ошибка 2020-04-18 16: 23: 34.456 21854-21978 / com.andor.watchit E / AndroidRuntime: ОСНОВНОЕ ИСКЛЮЧЕНИЕ: DefaultDispatcher-worker-3 Процесс: com.andor.watchit, PID: 21854 android .database.sqlite .SQLiteException: near "(": синтаксическая ошибка (код 1 SQLITE_ERROR [1]): при компиляции: SELECT * FROM (SELECT ROW_NUMBER () OVER (рейтинг ORDER BY) RowNum, * FROM mov ie) t WHERE t. RowNum> 0 AND t.RowNum <= 20 в android .database.sqlite.SQLiteConnection.nativePrepareStatement (собственный метод) в android .database.sqlite.SQLiteConnection.acquirePreparedStatement (SQLiteConnection. java: 1372) в android .database.sqlite.SQLiteConnection.prepare (SQLiteConnection. java: 811) в android .database.sq lite.SQLiteSession.prepare (SQLiteSession. java: 590) в android .database.sqlite.SQLiteProgram. (SQLiteProgram. java: 62) в android .database.sqlite.SQLiteQuery. (SQLiteQuery. java: 37) в android .database.sqlite.SQLiteDirectCursorDriver.query (SQLiteDirectCursorDriver. java: 46) в android .database.sqlite.SQLiteDatabase.rawQueryWithFactory (SQLiteDatabase. java: 1959) в android .database.sqlite.SQLiteDatabase.rawQueryWithFactory (SQLiteDatabase. java: 1934) в androidx.sqlite.db.framework.FrameworkSQLiteDatabase.query (FrameworkSQLiteDatabase. java: 161) в androidx.room.RoomDatabase.query (RoomD. 1063 *: 328) по адресу androidx.room.util.DBUtil.query (DBUtil. java: 83) по адресу com.andor.watchit.core.framework.db.MovieDao_Impl $ 8.call (MovieDao_Impl. java: 237) на com.andor.watchit.core.framework.db.MovieDao_Impl $ 8.call (MovieDao_Impl. java: 234) на androidx.room.CoroutinesRoom $ Companion $ execute $ 2.invokeSuspend (CoroutinesRoom.kt: 54) на kotlin .coroutines.jvm.internal.BaseContinuationImpl.resumeWith (Continuati onImpl.kt: 33) в kotlinx.coroutines.DispatchedTask.run (DispatchedTask.kt: 56) в java .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor. java: 1167) в java .util.con .ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor. java: 641) в java .lang.Thread.run (Thread. java: 919) </p>

Я хотел бы узнать решение реализовать разбиение на страницы с использованием ROOM?

PS: мой запрос состоит в том, чтобы просто получить 1-й элемент 20 прямо сейчас, т. е. 1-ю страницу, я могу сделать это динамическим c запросом позже, и в браузере БД это будет работать. не хочу загружать весь результат, а затем создавать страницы.

1 Ответ

0 голосов
/ 18 апреля 2020

Я нашел решение вышеупомянутой проблемы, используя LIMIT и OFFSET

@Query("SELECT * FROM movie ORDER BY rating DESC LIMIT :pageSize OFFSET (:pageNumber-1)*:pageSize")
suspend fun getPagedMovie(pageNumber: Int, pageSize: Int): List<MovieEntity>

Wi sh и эту помощь другим людям.

И спасибо @ dev-masih также за ссылку в комментарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...