В чем разница между Query и RawQuery в Room

«В чем разница между Query и RawQuery в Room» — вопрос из категории Базы данных, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Query и RawQuery в Room используются для выполнения SQL-запросов, но с разными уровнями абстракции:

  1. @Query
    • Компилятор проверяет синтаксис SQL на этапе компиляции.
    • Поддерживает связывание параметров через :paramName.
    • Возвращает типизированные результаты (например, List<User>).
@Query("SELECT * FROM users WHERE age > :minAge")
fun getUsersOlderThan(minAge: Int): List<User>
  1. @RawQuery**
    • Принимает SQL как строку (динамические запросы).
    • Нет проверки синтаксиса на этапе компиляции.
    • Используется с SupportSQLiteQuery.
    • Полезен для сложных динамических запросов.
@RawQuery
fun getUsers(query: SupportSQLiteQuery): List<User>

// Использование
val query = SimpleSQLiteQuery("SELECT * FROM users WHERE name LIKE ?", arrayOf("%John%"))
val users = dao.getUsers(query)

Итог: Query — для статических запросов с проверкой, RawQuery — для динамических.