Проблема:
Я нажимаю 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 запросом позже, и в браузере БД это будет работать. не хочу загружать весь результат, а затем создавать страницы.