Для чего нужна аннотация Dao в Room

Ответ

Аннотация @Dao (Data Access Object) в Room помечает интерфейс или абстрактный класс, который определяет методы для доступа к базе данных. Она служит прослойкой между бизнес-логикой и SQL-запросами, упрощая работу с БД.

Ключевые моменты:

  • Содержит методы с аннотациями @Insert, @Update, @Delete, @Query
  • Room автоматически генерирует реализацию
  • Позволяет выполнять операции в UI-потоке (но лучше использовать корутины/RxJava)

Пример:

@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    fun getAll(): List<User>

    @Insert
    suspend fun insert(user: User)

    @Query("DELETE FROM users WHERE id = :userId")
    fun deleteById(userId: Int)
}

Ответ 18+ 🔞

Смотри, объясню на пальцах, что это за штука такая — @Dao. Представь, что твоя база данных — это какой-то овердохуища важный банк, а ты — клиент. Ты же не лезешь в хранилище сам, верно? Ты подходишь к операционисту, говоришь: «Хочу положить денег» или «Покажите мой счёт». Вот этот операционист, чувак, который знает все внутренние процедуры, но говорит с тобой на человеческом языке, — это и есть твой DAO.

По-русски это «объект доступа к данным». По сути, это прослойка, которая спасает тебя от прямого общения с SQL, чтобы ты не написал какую-нибудь дичь и не угробил всё. @Dao — это просто маркер, который ты вешаешь на интерфейс или абстрактный класс. Ты говоришь Room: «Слушай, вот тут список того, что мне от базы надо. Сделай так, чтобы это работало». А Room, такой хитрая жопа, берёт и сам генерирует всю реализацию под капотом. Красота же!

Что внутри обычно делают? Ну, стандартный набор:

  • @Insert — чтобы воткнуть новую запись. Типа «примите моего нового юзера, вот он».
  • @Update — чтобы обновить существующую. «Исправьте этому Васе фамилию, он женился».
  • @Delete — чтобы удалить. «Уберите этого Петю нахуй, он спамит».
  • @Query — а это самая мощная штука. Тут ты пишешь чистый SQL-запрос. Хочешь выбрать всех, кто старше 18? Пожалуйста: SELECT * FROM users WHERE age > 18. Room проверит этот запорт на ошибки ещё на этапе компиляции, что уже ебать мои старые костыли, как удобно.

Вот смотри на пример, тут всё понятно:

@Dao
interface UserDao {
    // Простой запрос: дай всех юзеров
    @Query("SELECT * FROM users")
    fun getAll(): List<User>

    // Вставка. suspend — значит, можно в корутине вызывать, не заблокируешь UI.
    @Insert
    suspend fun insert(user: User)

    // Удаление по ID. Видишь, как параметр :userId подставляется? Это пизда рулю.
    @Query("DELETE FROM users WHERE id = :userId")
    fun deleteById(userId: Int)
}

И последнее, но важное: технически Room позволяет вызывать эти методы из главного потока, но ёпта, не делай так! Это верный путь к тому, что твой интерфейс начнёт тормозить и дёргаться. Всегда оборачивай вызовы в корутины, RxJava или что там у тебя. Доверия к синхронному вызову из UI — ноль ебать. В общем, DAO — это твой верный переводчик с языка приложения на язык базы данных. Используй, и всё будет пучком.