Wzorzec Repository
Oddziel dostęp do danych od interfejsu użytkownika za pomocą wzorca Repository. Koordynuj bazę Room i sieciowe API jako pojedyncze źródła prawdy.
Wzorzec Repository to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 4 z 6. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Android Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Android Academy zawiera 6 lekcji w sumie.
Dlaczego Repository?
Wraz z rozwojem aplikacji ViewModel może zostać zaśmiecony kodem dostępu do danych (zapytaniami Room, wywołaniami Retrofit, odczytami SharedPreferences).
Wzorzec Repository przenosi cały dostęp do danych za pośrednictwem jednej klasy. ViewModel komunikuje się tylko z Repository — nie musi wiedzieć, skąd pochodzą dane.
Warstwy architektury
Zalecana architektura Androida składa się z trzech warstw:
- Warstwa UI — Activity/Fragment wyświetla dane i wysyła zdarzenia użytkownika
- ViewModel — przechowuje stan, przetwarza zdarzenia i wywołuje Repository
- Repository — pobiera dane z Room (lokalnie) lub Retrofit (zdalnie) oraz decyduje, którego źródła użyć
Proste Repository
Utwórz klasę Repository, która opakowuje DAO i zdalne 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 korzysta z Repository
ViewModel pobiera dane z Repository — nie bezpośrednio z 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)
}
}
}Strategia cache-first
Popularny wzorzec Repository to cache-first. Wyświetlaj natychmiast dane z lokalnej pamięci podręcznej, a następnie odświeżaj je w tle z sieci:
- 1. Natychmiast wyemituj dane z pamięci podręcznej Room
- 2. Pobierz aktualne dane z API
- 3. Zapisz je w Room — Flow zaktualizuje się automatycznie
Zapewnia to szybkie ładowanie i dane aktualizowane z opóźnieniem.
Implementacja cache-first
Odśwież lokalną bazę danych z sieci:
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
Gdy ViewModel ma parametry konstruktora, do jego utworzenia potrzebujesz 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 do wstrzykiwania zależności
Ręczne tworzenie instancji Repository i ViewModel staje się uciążliwe w dużych aplikacjach. Hilt (Dependency Injection) automatyzuje ten proces:
- Oznacz klasy adnotacjami
@HiltViewModel,@Inject - Hilt automatycznie tworzy zależności i udostępnia je
- Usuwa cały powtarzalny kod fabryk
Podsumowanie korzyści
Wzorzec Repository zapewnia:
- Testowalność — podczas testów jednostkowych można zastąpić prawdziwe API atrapą
- Rozdzielenie odpowiedzialności — ViewModel nie wie, czy dane są lokalne, czy zdalne
- Jedno źródło prawdy — źródłem zawsze jest Room, a API tylko je odświeża
- Elastyczność — można dodać buforowanie, stronicowanie lub nowe źródła danych bez modyfikowania ViewModelu
Szybkie sprawdzenie
Jaka jest główna odpowiedzialność Repository w architekturze Androida?
Podsumowanie: wzorzec Repository
Rozumiesz już zalecaną architekturę Androida:
- UI → ViewModel → Repository → (Room / Retrofit)
- Repository jest jednym źródłem prawdy
- Cache-first: natychmiast wyświetlaj dane lokalne i odświeżaj je w tle
- Używaj ViewModelFactory, gdy ViewModel ma parametry konstruktora
- Hilt automatyzuje wstrzykiwanie zależności w większych aplikacjach
Ostatni kurs: Sieć i publikowanie — Retrofit, obrazy i publikowanie aplikacji.
Często zadawane pytania
Czy lekcja „Wzorzec Repository” jest bezpłatna?
Tak — pełny tekst „Wzorzec Repository” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Android Academy, przejdź na CoddyKit PRO. Kurs Android Academy zawiera 6 lekcji w sumie.
Co nauczysz się w „Wzorzec Repository”?
Oddziel dostęp do danych od interfejsu użytkownika za pomocą wzorca Repository. Koordynuj bazę Room i sieciowe API jako pojedyncze źródła prawdy. Ćwiczysz Android Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Android Academy?
Nie wymagamy żadnego doświadczenia. Android Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 6.
Ile czasu zajmuje lekcja „Wzorzec Repository”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Android Academy?
Tak. Każda lekcja Android Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- ViewModel i LiveData
- Baza danych Room
- Korutyny i funkcje suspend
- Wzorzec Repository
- Navigation Component
- Wstrzykiwanie zależności z Hilt