fbpx

Создание DAO

DAO (data access object) позволяет выполнять SQL – запросы для чтения или обновления данных. Используя DAO Room сгенерирует запросы для работы с данными, например @Insert Таким образом вам достаточно только описать методы доступа к вашему объекту, а Room сгенерирует запросы.

DAO должен быть интерфейсом или абстрактным классом. По умолчанию, все запросы в БД должны выполняться в отдельном потоке. Room поддерживает корутины, для этого используется  suspend модификатор.

Создание DAO

Давайте создадим DAO который будет

  • Возвращать все слова алфавитном порядке
  • Вставлять слова
  • Удалять все слова

Для этого создайте класс  WordDao как показано ниже

@Dao
interface WordDao {

    @Query("SELECT * from word_table ORDER BY word ASC")
    fun getAlphabetizedWords(): List<Word>

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun insert(word: Word)

    @Query("DELETE FROM word_table")
    suspend fun deleteAll()
}

Рассмотрим, что означает каждая строка:

  1. WordDao является интерфейсом; DAOs могут быть либо интерфейсом, либо абстрактным классом.
  2. Аннотация @Dao обозначает  DAO класс для Room.
  3. suspend fun insert(word: Word) : Опсывате suspend функицю для вставки слова
  4. @Insert аннотация  относится к DAO методу вставки, где вам не нужно самостоятельно описывать SQL-запрос (К таким же методам относятся@Delete или @Update для обновления строк)
  5. onConflict = OnConflictStrategy.IGNORE: Выбранная стратегия игнорирует вставку нового слова, если уже существует точно такое же слово. Более подробно о других типах стратегий можно узнать из документации.
  6. suspend fun deleteAll(): Объявление suspend функции для удаления всех слов.
  7. Вспомогательного метода для удаления нет (как например при вставке или обновлении) поэтому для удаления необходимо добавить аннотацию @Query и добавить SQL – запрос.
  8. @Query("DELETE FROM word_table")@Query  аннотация используется для создания SQL – запроса, сам запрос нужно добавить в виде строки.
  9. fun getAlphabetizedWords(): List<Word>: метод для получения списка слов
  10. @Query("SELECT * from word_table ORDER BY word ASC"): Описание запроса для получения списка слова в алфавитном порядке.

Мы описали DAO и теперь можем использовать LiveData для получения данных и оповещения об их изменениях.