0Pricing
Android Academy · Урок

Шаблон репозитория

Отделяйте доступ к данным от пользовательского интерфейса с помощью шаблона репозитория. Координируйте работу базы данных Room и сетевого API как единых источников истины.

«Шаблон репозитория» — бесплатный урок Android Academy на CoddyKit. Это урок 4 из 6. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 6 уроков всего.

Зачем нужен Repository?

По мере роста приложения ViewModel может оказаться перегружен кодом доступа к данным (запросами Room, вызовами Retrofit, чтением из SharedPreferences).

Шаблон Repository скрывает весь доступ к данным за одним классом. ViewModel взаимодействует только с Repository и не зависит от источника данных.

Слои архитектуры

Рекомендуемая архитектура Android состоит из трёх слоёв:

  • Слой UI — Activity/Fragment отображает данные и передаёт события пользователя
  • ViewModel — хранит состояние, обрабатывает события и вызывает Repository
  • Repository — получает данные из Room (локально) или Retrofit (удалённо) и выбирает источник

Простой Repository

Создайте класс Repository, который объединяет Ваш DAO и удалённый API:

class NoteRepository(private val dao: NoteDao) {

    // Expose a Flow that emits whenever data changes
    val allNotes = dao.getAllNotes()

    suspend fun insert(note: Note) {
        dao.insert(note)
    }

    suspend fun delete(note: Note) {
        dao.delete(note)
    }

    suspend fun update(note: Note) {
        dao.update(note)
    }
}

ViewModel использует Repository

ViewModel получает данные из Repository, а не напрямую из DAO:

class NoteViewModel(private val repo: NoteRepository) : ViewModel() {

    val notes = repo.allNotes  // Flow from Repository

    fun addNote(title: String, body: String) {
        viewModelScope.launch {
            repo.insert(Note(title = title, body = body))
        }
    }

    fun deleteNote(note: Note) {
        viewModelScope.launch {
            repo.delete(note)
        }
    }
}

Стратегия «сначала кэш»

Распространённый шаблон Repository — сначала кэш. Сначала сразу покажите локально кэшированные данные, а затем обновите их из сети в фоновом режиме:

  • 1. Сразу выдайте кэшированные данные из Room
  • 2. Получите свежие данные из API
  • 3. Сохраните их в Room — Flow обновится автоматически

Так Вы получаете быструю загрузку и данные, которые со временем обновляются.

Реализация стратегии «сначала кэш»

Обновите локальную базу данных из сети:

class ProductRepository(
    private val dao: ProductDao,
    private val api: ProductApiService
) {
    // Room Flow emits local data immediately
    val products = dao.getAllProducts()

    // Call this to sync with the server
    suspend fun refresh() {
        try {
            val remoteProducts = api.getProducts()
            dao.insertAll(remoteProducts)  // overwrites local cache
        } catch (e: Exception) {
            // Network failed — cached data is still shown
        }
    }
}

ViewModelFactory

Если у ViewModel есть параметры конструктора, для его создания понадобится ViewModelFactory:

class NoteViewModelFactory(
    private val repo: NoteRepository
) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        @Suppress("UNCHECKED_CAST")
        return NoteViewModel(repo) as T
    }
}

// In Activity:
val db = NoteDatabase.getInstance(this)
val repo = NoteRepository(db.noteDao())
val factory = NoteViewModelFactory(repo)
val viewModel = ViewModelProvider(this, factory)[NoteViewModel::class.java]

Hilt для внедрения зависимостей

В больших приложениях ручное создание экземпляров Repository и ViewModel быстро становится утомительным. Hilt (внедрение зависимостей) автоматизирует этот процесс:

  • Пометьте классы аннотациями @HiltViewModel и @Inject
  • Hilt автоматически создаёт зависимости и предоставляет их
  • Избавляет от шаблонного кода фабрик

Кратко о преимуществах

Шаблон Repository обеспечивает:

  • Удобство тестирования — замену настоящего API имитацией для модульных тестов
  • Разделение ответственности — ViewModel не знает, являются ли данные локальными или удалёнными
  • Единый источник истины — источником всегда служит Room, а API лишь обновляет его
  • Гибкость — можно добавлять кэширование, постраничную загрузку или новые источники данных, не изменяя ViewModel

Быстрая проверка

Какова основная ответственность Repository в архитектуре Android?

Повторение: шаблон Repository

Теперь Вы понимаете рекомендуемую архитектуру Android:

  • UI → ViewModel → Repository → (Room / Retrofit)
  • Repository — единый источник истины
  • Сначала кэш: локальные данные отображаются сразу, а обновление выполняется в фоновом режиме
  • Используйте ViewModelFactory, если у ViewModel есть параметры конструктора
  • Hilt автоматизирует внедрение зависимостей в больших приложениях

Последний курс: сеть и доработка — Retrofit, изображения и публикация.

Часто задаваемые вопросы

Урок «Шаблон репозитория» бесплатный?

Да — полный текст урока «Шаблон репозитория» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 6 уроков всего.

Чему я научусь в уроке «Шаблон репозитория»?

Отделяйте доступ к данным от пользовательского интерфейса с помощью шаблона репозитория. Координируйте работу базы данных Room и сетевого API как единых источников истины. Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 6.

Сколько времени занимает урок «Шаблон репозитория»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. ViewModel и LiveData
  2. База данных Room
  3. Корутины и приостанавливаемые функции
  4. Шаблон репозитория
  5. Компонент навигации
  6. Внедрение зависимостей с Hilt
← Назад к Android Academy