# Pattern: offline-first med SwiftData **Når:** appen eier sine data lokalt, ingen backend (eller backend kun som sync-tillegg). Den enkleste personvern-posisjonen og det riktige valget for små single-purpose-apper. ## Form - **`@Model`-klasser** definerer skjemaet. Ingen `NSManagedObject`, ingen `.xcdatamodeld`. - **`ModelContainer`** opprettes ved app-start; `ModelContext` injiseres i view-treet via `.modelContainer(...)`. - **`@Query`** i views for reaktiv henting; muter via `modelContext.insert/delete` + (auto)`save`. - **Migrasjoner:** `SchemaMigrationPlan` med versjonerte `VersionedSchema`-er. Planlegg fra dag 1 — skjemaet *vil* endre seg. ## Offline-first-disiplin - All lesning/skriving går mot lokal store; ingen view venter på nett. - Hvis sync legges til senere: lokal store er sannheten, sync er en bakgrunnsoppgave som reconciler — ikke omvendt. Konflikt-strategi (last-write-wins / per-felt-merge) er en arkitektur-beslutning (fase 3-ADR). - Backup: SwiftData-store ligger i app-containeren og dekkes av iCloud-enhets-backup automatisk. Eksplisitt iCloud-sync krever CloudKit-integrasjon (`ModelConfiguration(... , cloudKitDatabase: .automatic)`) — en bevisst tilleggsbeslutning, ikke default. ## Deling med widget / Live Activity Store må ligge i en **App Group**-container for å være synlig for extensions. Se `patterns/widget-live-activities-shared-model.md` — dette pattern-et og det henger sammen for enhver app med widgets. ## Fallgruver - **Ikke** anta at endringer i app-prosessen er øyeblikkelig synlige i widget-prosessen — refresh-timing er mer pålitelig på iOS 18+ enn iOS 17. ([Hacking with Swift — SwiftData i widgets](https://www.hackingwithswift.com/quick-start/swiftdata/how-to-access-a-swiftdata-container-from-widgets)) - **Ikke** behold en stor `ModelContainer` i minne i en widget-extension uten grunn — extension-minnebudsjettet er stramt. - **Ikke** hopp over migrasjonsplanen "fordi appen er liten" — en uplanlagt skjemaendring etter lansering kan kreve destruktiv migrasjon. ## App-brief-signal som trigger dette pattern-et "Ingen backend / all data lokal", "fungerer offline", "personvern-bevarende", "én bruker, egen enhet".