Repository-mønsteret
Skill datatilgang fra brukergrensesnittet med Repository-mønsteret. Samordne Room-databasen og nettverks-API-et som felles sannhetskilder.
Repository-mønsteret er en gratis leksjon i Android Academy på CoddyKit. Dette er leksjon 4 av 6. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Android Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Android Academy inneholder totalt 6 leksjoner.
Hvorfor et Repository?
Etter hvert som appen vokser, kan ViewModel bli overfylt med kode for datatilgang (Room-spørringer, Retrofit-kall og lesing fra SharedPreferences).
Repository-mønsteret samler all datatilgang bak én enkelt klasse. ViewModel kommuniserer bare med Repository — den trenger ikke å vite hvor dataene kommer fra.
Arkitekturlagene
Den anbefalte Android-arkitekturen har tre lag:
- UI Layer — Activity/Fragment viser data og sender brukerhendelser
- ViewModel — inneholder tilstand, behandler hendelser og kaller Repository
- Repository — henter data fra Room (lokalt) eller Retrofit (eksternt) og avgjør hvilken kilde som skal brukes
Et enkelt Repository
Opprett en Repository-klasse som pakker inn DAO-et og det eksterne API-et:
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 bruker Repository
ViewModel henter data fra Repository — ikke direkte fra DAO-et:
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)
}
}
}Cache-først-strategi
Et vanlig Repository-mønster er cache-først. Vis lokalt mellomlagrede data umiddelbart, og oppdater deretter fra nettverket i bakgrunnen:
- 1. Send mellomlagrede data fra Room umiddelbart
- 2. Hent oppdaterte data fra API-et
- 3. Lagre i Room — Flow oppdateres automatisk
Dette gir rask innlasting og data som til slutt blir oppdatert.
Implementering av cache-først
Oppdater den lokale databasen fra nettverket:
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
Når en ViewModel har parametere i konstruktøren, trenger De en ViewModelFactory for å opprette den:
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 for dependency injection
Det blir tidkrevende å opprette Repository- og ViewModel-instanser manuelt i store apper. Hilt (Dependency Injection) automatiserer dette:
- Kommenter klassene med
@HiltViewModelog@Inject - Hilt oppretter og leverer avhengigheter automatisk
- Fjerner all overflødig factory-kode
Oppsummering av fordelene
Repository-mønsteret gir:
- Testbarhet — bytt ut det ekte API-et med en falsk implementasjon i enhetstester
- Separation of concerns — ViewModel vet ikke om dataene er lokale eller eksterne
- Én sannhetskilde — Room er alltid kilden; API-et oppdaterer den bare
- Fleksibilitet — legg til mellomlagring, paginering eller nye datakilder uten å endre ViewModel
Kort kontroll
Hva er Repository sin hovedoppgave i Android-arkitekturen?
Oppsummering: Repository-mønsteret
De forstår nå den anbefalte Android-arkitekturen:
- UI → ViewModel → Repository → (Room / Retrofit)
- Repository er den eneste sannhetskilden
- Cache-først: vis lokale data umiddelbart og oppdater i bakgrunnen
- Bruk ViewModelFactory når ViewModel har parametere i konstruktøren
- Hilt automatiserer dependency injection i større apper
Siste kurs: Nettverk og finpuss — Retrofit, bilder og publisering.
Lær deg Kotlin med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 36
- Leksjoner
- 152
Ofte stilte spørsmål
Er leksjonen «Repository-mønsteret» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Android Academy, inkludert «Repository-mønsteret», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Android Academy inneholder totalt 6 leksjoner.
Hva lærer jeg i «Repository-mønsteret»?
Skill datatilgang fra brukergrensesnittet med Repository-mønsteret. Samordne Room-databasen og nettverks-API-et som felles sannhetskilder. Du øver på Android Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Android Academy?
Ingen tidligere erfaring er nødvendig. Android Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 6.
Hvor lang tid tar leksjonen «Repository-mønsteret»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Android Academy-leksjonen?
Ja. Alle Android Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- ViewModel og LiveData
- Room-database
- Coroutines og suspend-funksjoner
- Repository-mønsteret
- Navigation Component
- Dependency Injection med Hilt