Android Academy · Lektion

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.

Lektion 4 av 611 steg

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 @HiltViewModel och @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.

Gratis att börja

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

  1. ViewModel och LiveData
  2. Room-databas
  3. Coroutines och suspend-funktioner
  4. Repository-mönstret
  5. Navigation Component
  6. Dependency Injection med Hilt
← Tillbaka till Android Academy