Repository-mönstret
Separera dataåtkomst från användargränssnittet med Repository-mönstret. Samordna Room-databasen och nätverks-API:t som gemensamma källor till sanning.
Repository-mönstret är en gratis lektion i Android Academy på CoddyKit. Detta är lektion 4 av 6. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Android Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Android Academy innehåller totalt 6 lektioner.
Varför använda ett Repository?
När appen växer kan ViewModel bli överbelastad med dataåtkomstkod (Room-frågor, Retrofit-anrop och läsningar från SharedPreferences).
Repository-mönstret samlar all dataåtkomst bakom en enda klass. ViewModel kommunicerar bara med Repository och behöver inte känna till var datan kommer ifrån.
Arkitekturlagren
Den rekommenderade Android-arkitekturen har tre lager:
- UI Layer — Activity/Fragment visar data och skickar användarhändelser
- ViewModel — lagrar tillstånd, behandlar händelser och anropar Repository
- Repository — hämtar data från Room (lokalt) eller Retrofit (fjärranslutet) och avgör vilken källa som ska användas
Ett enkelt Repository
Skapa en Repository-klass som kapslar in din DAO och ditt fjärr-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 använder Repository
ViewModel hämtar data från Repository — inte direkt från 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)
}
}
}Strategin cache först
Ett vanligt Repository-mönster är cache först. Visa lokalt cachad data direkt och uppdatera sedan från nätverket i bakgrunden:
- 1. Skicka ut cachad data från Room direkt
- 2. Hämta aktuell data från API:t
- 3. Spara till Room — Flow uppdateras automatiskt
Det ger korta laddningstider och data som till slut är aktuell.
Implementering av cache först
Uppdatera den lokala databasen från nätverket:
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 parametrar i konstruktorn behöver du en ViewModelFactory för att skapa 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 för dependency injection
Att skapa Repository- och ViewModel-instanser manuellt blir omständligt i stora appar. Hilt (Dependency Injection) automatiserar detta:
- Annotera dina klasser med
@HiltViewModeloch@Inject - Hilt skapar och tillhandahåller beroenden automatiskt
- Tar bort all överflödig factory-kod
Sammanfattning av fördelarna
Repository-mönstret ger:
- Testbarhet — byt ut det riktiga API:t mot ett testobjekt i enhetstester
- Separation av ansvar — ViewModel vet inte om datan är lokal eller fjärransluten
- En enda sanningskälla — Room är alltid källan; API:t uppdaterar bara den
- Flexibilitet — lägg till cachning, paginering eller nya datakällor utan att ändra ViewModel
Snabbtest
Vilket är Repositorys huvudsakliga ansvar i Android-arkitekturen?
Sammanfattning: Repository-mönstret
Nu förstår du den rekommenderade Android-arkitekturen:
- UI → ViewModel → Repository → (Room / Retrofit)
- Repository är den enda sanningskällan
- Cache först: visa lokal data direkt och uppdatera i bakgrunden
- Använd ViewModelFactory när ViewModel har parametrar i konstruktorn
- Hilt automatiserar dependency injection i större appar
Sista kursen: Nätverk och finputsning — Retrofit, bilder och publicering.
Lär dig Kotlin med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 36
- Lektioner
- 152
Vanliga frågor
Är lektionen ”Repository-mönstret” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Android Academy, inklusive ”Repository-mönstret”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Android Academy innehåller totalt 6 lektioner.
Vad lär jag mig i ”Repository-mönstret”?
Separera dataåtkomst från användargränssnittet med Repository-mönstret. Samordna Room-databasen och nätverks-API:t som gemensamma källor till sanning. Ni övar på Android Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Android Academy?
Du behöver inga förkunskaper. Utbildningen i Android Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 6.
Hur lång tid tar lektionen ”Repository-mönstret”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Android Academy-lektionen?
Ja. Varje Android Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- ViewModel och LiveData
- Room-databas
- Coroutines och suspend-funktioner
- Repository-mönstret
- Navigation Component
- Dependency Injection med Hilt