Gegevensopslag is een van de belangrijkste taken van een mobiele applicatie en beïnvloedt prestaties, beveiliging en gebruikerservaring. In dit artikel behandelen we SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore en Keychain, evenals serialisatieformaten (JSON, Protobuf) en bibliotheken (Gson, Moshi, kotlinx.serialization). Deze gids helpt beginnende ontwikkelaars de juiste oplossing voor gegevensopslag te kiezen. Meer informatie vindt u in de officiële Android-handleiding voor gegevensopslag.
Belangrijkste punten
Voor het opslaan van gestructureerde gegevens met relaties tussen entiteiten worden relationele databases gebruikt.
SQLite is een ingebedde relationele database die op elk mobiel platform werkt. Het vereist geen aparte server en gegevens worden in één bestand opgeslagen. SQLite is de basis voor Room (Android) en optioneel voor Core Data (iOS). Bibliotheken: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).
Room is de officiële Android Architecture Components-bibliotheek voor het werken met SQLite. Het biedt een ORM-laag: Entity (tabel), DAO (query's), Database (ingangspunt). Room controleert SQL-query's tijdens het compileren, ondersteunt coroutines en Flow en migreert automatisch het schema.
@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 is het framework van Apple voor het beheren van een objectgraaf. Het is geen pure database — het is een persistentielaag bovenop SQLite, XML of binaire opslag. Core Data beheert objecten (NSManagedObject), relaties, schemaversiebeheer, ongedaan maken/opnieuw uitvoeren en multithreading via NSManagedObjectContext.
Realm is een alternatief voor SQLite, ontworpen als een hoogwaardige mobiele database. Realm is sneller dan SQLite bij lezen en schrijven, ondersteunt reactieve meldingen (Live Objects), on-the-fly encryptie en cross-platform (Android, iOS, Flutter, React Native). Nadelen: grotere APK/IPA-grootte en hoger geheugengebruik.
Voor het opslaan van kleine hoeveelheden gegevens (instellingen, tokens, cache) worden eenvoudige sleutel-waarde opslagen gebruikt.
SharedPreferences is een verouderde sleutel-waarde opslag in Android. Nadelen: synchrone toegang (blokkeert UI bij lezen), gebrek aan typering, ANR-risico bij het laden van grote bestanden. NIET aanbevolen voor nieuwe projecten.
DataStore is de moderne vervanging van SharedPreferences van Google. Het werkt asynchroon via Kotlin Coroutines en Flow, ondersteunt Preferences DataStore (sleutel-waarde) en Proto DataStore (getypeerde gegevens via Protobuf). DataStore is veilig voor de UI-thread en ondersteunt transacties.
UserDefaults is de standaardopslag voor kleine instellingen in iOS. Het ondersteunt primitieve typen, tekenreeksen, datums, Data. UserDefaults is synchroon en daarom niet geschikt voor grote gegevensvolumes. Registratie van waarden via register(defaults:) stelt standaardwaarden in.
Voor gegevensopslag in toepassingen die synchronisatie tussen apparaten vereisen, worden Firebase-clouddatabases gebruikt.
Firebase Firestore is een NoSQL-documentdatabase met real-time abonnementen, automatisch schalen, krachtige query's en ingebouwde offline modus. Gegevens worden georganiseerd in verzamelingen en documenten (JSON-achtige structuren). Firestore ondersteunt transacties en batchbewerkingen. Ideaal voor chats, feeds en sociale apps.
Firebase Realtime Database is een oudere Firebase NoSQL-database die gegevens opslaat als één JSON-boom. Eenvoudiger dan Firestore maar minder flexibel in query's en schalen. Aanbevolen voor eenvoudige real-time toepassingen (online status, eenvoudige chats).
| Kenmerk | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| Gegevensmodel | Verzamelingen → Documenten | JSON-boom |
| Query's | Complex (filteren, sorteren, limieten) | Eenvoudig (op sleutel) |
| Schalen | Automatisch | Handmatig sharden |
| Offline modus | Ja (permanente cache) | Ja |
| Prijzen | Per lees-/schrijfbewerking | Per verkeer + opslag |
Het opslaan van tokens, wachtwoorden en encryptiesleutels vereist speciale beveiligde opslag.
Android Keystore is een systeemopslag voor cryptografische sleutels. Sleutels worden opgeslagen in een hardwareomgeving (TEE — Trusted Execution Environment), ontoegankelijk voor apps en het besturingssysteem. Het ondersteunt sleutelgeneratie, encryptie en ondertekening. Android 9+ bevat StrongBox Keymaster (dedicated chip).
Keychain Services is een veilige iOS-opslag voor wachtwoorden, sleutels en certificaten. Gegevens worden versleuteld met behulp van de hardware Secure Enclave. Keychain ondersteunt toegankelijkheidsniveaus: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.
EncryptedSharedPreferences is een wrapper rond SharedPreferences met sleutel- en waardecodering via AES256-GCM en HKDF. Geïmplementeerd in de AndroidX Security-bibliotheek. Aanbevolen voor het opslaan van tokens en gevoelige instellingen.
Bij IT Sectr gebruiken we Android Keystore + EncryptedSharedPreferences voor het opslaan van vernieuwingstokens en biometrische sleutels. Op iOS gebruiken we Keychain met het niveau kSecAttrAccessibleWhenUnlockedThisDeviceOnly voor maximale beveiliging.
Voor bestandsopslag (afbeeldingen, video's, documenten) bieden mobiele platforms verschillende soorten opslag.
Android maakt onderscheid tussen Internal Storage (/data/data/package/ — privéopslag) en External Storage (SD-kaart of geëmuleerde partitie). Cache Directory is tijdelijke opslag die het systeem kan wissen. Scoped Storage (Android 10+) beperkt de toegang tot External Storage — apps zien alleen hun eigen bestanden of bestanden via MediaStore/SAF.
iOS biedt Documents Directory (iCloud-back-up, permanente gegevens), Library/Caches (tijdelijke bestanden, geen back-up) en Tmp Directory (tijdelijk, kunnen worden gewist). Gebruik NSFileManager om met het bestandssysteem te werken. iOS 11+ ondersteunt File Provider voor cloudbestanden.
Serialisatie converteert objecten naar een formaat voor verzending of opslag. Deserialisatie is het omgekeerde proces.
JSON (JavaScript Object Notation) is het populairste formaat: leesbaar, flexibel, ondersteund door alle platforms. XML is strikter, gebruikt in verouderde systemen. Protobuf (Protocol Buffers) is een binair formaat van Google: 3-10x compacter dan JSON, sneller te parseren, met een strikt schema. Gebruikt voor systemen met hoge belasting en microservices.
JSONSerialization is de ingebouwde API voor het werken met JSON. Codable (Encodable/Decodable) is een modern Swift-protocol voor automatische serialisatie naar JSON, Property List en andere formaten.
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)
Voor Flutter en React Native bestaan er eigen efficiënte opslagbibliotheken.
Hive is een lichte, snelle sleutel-waarde opslag voor Flutter. Het vereist geen native code (pure Dart), ondersteunt typering via TypeAdapter en werkt in isolates. Ideaal voor cache, instellingen en kleine gegevensvolumes.
ObjectBox is een hoogwaardige ingebedde database voor Flutter, Android en iOS. Het is 10+ keer sneller dan SQLite en gebruikt een platte bestandsstructuur voor minimale overhead. Ondersteunt relaties, query's en reactieve abonnementen (ObjectBox Dart).
Drift is een reactieve SQLite-bibliotheek voor Flutter en Dart. Het biedt typeveilige query's, migraties, DAO-functies en Stream-ondersteuning (reactieve updates). Drift is de primaire keuze voor Flutter-projecten die SQLite nodig hebben.
Veelgestelde vragen
De keuze hangt af van het platform: Room (Android) is de officiële SQLite-gebaseerde bibliotheek met compilatie-tijd querycontrole. Core Data (iOS) is het framework van Apple met een objectgraaf. Voor cross-platformprojecten zijn Realm of SQLite via ORM geschikt.
SharedPreferences is een oude implementatie met synchrone toegang en ANR-risico. DataStore (Jetpack) is een moderne vervanging op basis van Kotlin Coroutines en Flow, die asynchroniteit, typering en foutbeveiliging ondersteunt.
Android: EncryptedSharedPreferences of Android Keystore. iOS: Keychain Services met toegankelijkheid WhenUnlockedThisDeviceOnly. Voor kritieke gegevens gebruikt u Secure Enclave (iOS) en hardware-Keystore (Android) met biometrie.
Cloud Firestore is een NoSQL-database van Firebase met real-time synchronisatie, offline modus en automatisch schalen. Geschikt voor chats, nieuwsfeeds en projecten die synchronisatie tussen apparaten nodig hebben.
Flutter: Hive (snelle sleutel-waarde), Floor (SQLite ORM), Drift (Moor, reactieve SQLite), ObjectBox (hoogwaardige ingebedde DB). React Native: Realm, WatermelonDB (lazy loading) en AsyncStorage (vergelijkbaar met SharedPreferences).
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.