Datalagring är en av de viktigaste uppgifterna för en mobilapplikation, som påverkar prestanda, säkerhet och användarupplevelse. I den här artikeln kommer vi att täcka SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore och Keychain, samt serialiseringsformat (JSON, Protobuf) och bibliotek (Gson, Moshi, kotlinx.serialization). Den här guiden hjälper nybörjarutvecklare att välja rätt datalagringslösning. Läs mer i den officiella Android-guiden för datalagring.
Viktiga punkter
För att lagra strukturerad data med relationer mellan entiteter används relationsdatabaser.
SQLite är en inbäddad relationsdatabas som fungerar på alla mobila plattformar. Den kräver ingen separat server, data lagras i en enda fil. SQLite är grunden för Room (Android) och valfritt för Core Data (iOS). Bibliotek: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).
Room är det officiella Android Architecture Components-biblioteket för att arbeta med SQLite. Det tillhandahåller ett ORM-lager: Entity (tabell), DAO (frågor), Database (inkörsport). Room kontrollerar SQL-frågor vid kompilering, stöder koroutiner och Flow och migrerar automatiskt schemat.
@Entity data class User( @PrimaryKey val id: Int, val name: String, val email: String ) @Dao interface UserDao { @Query("SELECT * FROM user WHERE id = :id") suspend fun getUser(id: Int): User? }
Core Data är Apples ramverk för att hantera en objektgraf. Det är inte en ren databas — det är ett persistenslager ovanpå SQLite, XML eller binär lagring. Core Data hanterar objekt (NSManagedObject), relationer, schemaversionering, ångra/gör om och flertrådning via NSManagedObjectContext.
Realm är ett alternativ till SQLite, designat som en högpresterande mobil databas. Realm är snabbare än SQLite vid läsning och skrivning, stöder reaktiva notifieringar (Live Objects), kryptering i farten och plattformsoberoende (Android, iOS, Flutter, React Native). Nackdelar: ökad APK/IPA-storlek och högre minnesanvändning.
För att lagra små mängder data (inställningar, tokens, cache) används enkla nyckel-värde-lager.
SharedPreferences är ett äldre nyckel-värde-lager i Android. Nackdelar: synkron åtkomst (blockerar UI vid läsning), brist på typning, ANR-risk vid laddning av stora filer. Rekommenderas INTE för nya projekt.
DataStore är den moderna ersättningen för SharedPreferences från Google. Den fungerar asynkront via Kotlin Coroutines och Flow, stöder Preferences DataStore (nyckel-värde) och Proto DataStore (typad data via Protobuf). DataStore är säker för UI-tråden och stöder transaktioner.
UserDefaults är standardlagring för små inställningar i iOS. Den stöder primitiva typer, strängar, datum, Data. UserDefaults är synkron, så den är inte lämplig för stora datavolymer. Registrering av värden via register(defaults:) anger standardvärden.
För datalagring i applikationer som kräver synkronisering mellan enheter används Firebase molndatabaser.
Firebase Firestore är en NoSQL-dokumentdatabas med realtidsprenumerationer, automatisk skalning, kraftfulla frågor och inbyggt offlineläge. Data organiseras i samlingar och dokument (JSON-liknande strukturer). Firestore stöder transaktioner och batchoperationer. Idealisk för chattar, flöden och sociala appar.
Firebase Realtime Database är en äldre Firebase NoSQL-databas som lagrar data som ett enda JSON-träd. Enklare än Firestore men mindre flexibel i frågor och skalning. Rekommenderas för enkla realtidsapplikationer (online-status, enkla chattar).
| Funktion | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| Datamodell | Samlingar → Dokument | JSON-träd |
| Frågor | Komplexa (filtrering, sortering, gränser) | Enkla (efter nyckel) |
| Skalning | Automatisk | Manuell sharding |
| Offlineläge | Ja (beständig cache) | Ja |
| Pris | Per läs-/skrivoperation | Per trafik + lagring |
Lagring av tokens, lösenord och krypteringsnycklar kräver särskilda skyddade lager.
Android Keystore är en systemlagring för kryptografiska nycklar. Nycklar lagras i en hårdvarumiljö (TEE — Trusted Execution Environment), otillgänglig för appar och operativsystem. Den stöder nyckelgenerering, kryptering och signering. Android 9+ innehåller StrongBox Keymaster (dedikerat chip).
Keychain Services är en säker iOS-lagring för lösenord, nycklar och certifikat. Data krypteras med hårdvarans Secure Enclave. Keychain stöder tillgänglighetsnivåer: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.
EncryptedSharedPreferences är ett omslag kring SharedPreferences med nyckel- och värdekryptering via AES256-GCM och HKDF. Implementerat i AndroidX Security-biblioteket. Rekommenderas för lagring av tokens och känsliga inställningar.
På IT Sectr använder vi Android Keystore + EncryptedSharedPreferences för att lagra uppdateringstoken och biometribaserade nycklar. På iOS använder vi Keychain med nivån kSecAttrAccessibleWhenUnlockedThisDeviceOnly för maximal säkerhet.
För fillagring (bilder, videor, dokument) tillhandahåller mobila plattformar flera typer av lagring.
Android skiljer mellan Internal Storage (/data/data/paket/ — privat lagring) och External Storage (SD-kort eller emulerad partition). Cache Directory är tillfällig lagring som systemet kan rensa. Scoped Storage (Android 10+) begränsar åtkomsten till External Storage — appar ser bara sina egna filer eller filer via MediaStore/SAF.
iOS tillhandahåller Documents Directory (iCloud-säkerhetskopiering, beständig data), Library/Caches (tillfälliga filer, ingen säkerhetskopiering) och Tmp Directory (tillfälliga, kan rensas). Använd NSFileManager för att arbeta med filsystemet. iOS 11+ stöder File Provider för molnfiler.
Serialisering omvandlar objekt till ett format för överföring eller lagring. Deserialisering är den omvända processen.
JSON (JavaScript Object Notation) är det populäraste formatet: läsbart, flexibelt, stöds av alla plattformar. XML är striktare, används i äldre system. Protobuf (Protocol Buffers) är ett binärt format från Google: 3-10 gånger mer kompakt än JSON, snabbare att tolka, med strikt schema. Används för högbelastade system och mikrotjänster.
JSONSerialization är det inbyggda API:t för att arbeta med JSON. Codable (Encodable/Decodable) är ett modernt Swift-protokoll för automatisk serialisering till JSON, Property List och andra format.
struct User: Codable { let id: Int let name: String let email: String } let user = User(id: 1, name: "Alice", email: "alice@example.com") let encoder = JSONEncoder() let jsonData = try encoder.encode(user)
För Flutter och React Native finns det egna effektiva lagringsbibliotek.
Hive är ett lätt, snabbt nyckel-värde-lager för Flutter. Det kräver ingen native-kod (ren Dart), stöder typning via TypeAdapter och fungerar i isolat. Idealisk för cache, inställningar och små datavolymer.
ObjectBox är en högpresterande inbäddad databas för Flutter, Android och iOS. Den är 10+ gånger snabbare än SQLite och använder en platt filstruktur för minimal overhead. Stöder relationer, frågor och reaktiva prenumerationer (ObjectBox Dart).
Drift är ett reaktivt SQLite-bibliotek för Flutter och Dart. Det tillhandahåller typsäkra frågor, migreringar, DAO-funktioner och Stream-stöd (reaktiva uppdateringar). Drift är det främsta valet för Flutter-projekt som kräver SQLite.
Vanliga frågor
Valet beror på plattformen: Room (Android) är det officiella SQLite-baserade biblioteket med kompileringstidskontroll av frågor. Core Data (iOS) är Apples ramverk med objektgraf. För plattformsoberoende projekt är Realm eller SQLite via ORM lämpligt.
SharedPreferences är en gammal implementering med synkron åtkomst och ANR-risk. DataStore (Jetpack) är en modern ersättning baserad på Kotlin Coroutines och Flow, som stöder asynkronitet, typning och felskydd.
Android: EncryptedSharedPreferences eller Android Keystore. iOS: Keychain Services med tillgänglighet WhenUnlockedThisDeviceOnly. För kritisk data, använd Secure Enclave (iOS) och hårdvaru-Keystore (Android) med biometri.
Cloud Firestore är en NoSQL-databas från Firebase med realtidssynkronisering, offlineläge och automatisk skalning. Lämplig för chattar, nyhetsflöden och projekt som behöver synkronisering mellan enheter.
Flutter: Hive (snabb nyckel-värde), Floor (SQLite ORM), Drift (Moor, reaktiv SQLite), ObjectBox (högpresterande inbäddad DB). React Native: Realm, WatermelonDB (lat laddning) och AsyncStorage (liknar SharedPreferences).
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.