Шаблон репозитория
Отделяйте доступ к данным от пользовательского интерфейса с помощью шаблона репозитория. Координируйте работу базы данных 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 — локальная установка не требуется.
Все уроки этого курса
- ViewModel и LiveData
- База данных Room
- Корутины и приостанавливаемые функции
- Шаблон репозитория
- Компонент навигации
- Внедрение зависимостей с Hilt