Die Datenspeicherung ist eine der zentralen Aufgaben einer mobilen Anwendung und wirkt sich auf Leistung, Sicherheit und Benutzererfahrung aus. In diesem Artikel behandeln wir SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore und Keychain sowie Serialisierungsformate (JSON, Protobuf) und Bibliotheken (Gson, Moshi, kotlinx.serialization). Dieser Leitfaden hilft angehenden Entwicklern, die richtige Datenspeicherlösung zu finden. Weitere Informationen finden Sie im offiziellen Android-Leitfaden zur Datenspeicherung.
Wichtige Erkenntnisse
Für die Speicherung strukturierter Daten mit Beziehungen zwischen Entitäten werden relationale Datenbanken verwendet.
SQLite ist eine eingebettete relationale Datenbank, die auf allen mobilen Plattformen funktioniert. Sie benötigt keinen separaten Server, die Daten werden in einer einzigen Datei gespeichert. SQLite ist die Grundlage für Room (Android) und optional für Core Data (iOS). Bibliotheken: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).
Room ist die offizielle Android Architecture Components Bibliothek für die Arbeit mit SQLite. Sie bietet eine ORM-Schicht: Entity (Tabelle), DAO (Abfragen), Database (Einstiegspunkt). Room prüft SQL-Abfragen zur Kompilierzeit, unterstützt Koroutinen und Flow und migriert das Schema automatisch.
@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 ist Apples Framework zur Verwaltung eines Objektgraphen. Es ist keine reine Datenbank — es ist eine Persistenzschicht über SQLite, XML oder binärem Speicher. Core Data verwaltet Objekte (NSManagedObject), Beziehungen, Schema-Versionierung, Rückgängig/Wiederholen und Multithreading über NSManagedObjectContext.
Realm ist eine Alternative zu SQLite, entwickelt als Hochleistungs-Mobil-Datenbank. Realm ist beim Lesen und Schreiben schneller als SQLite, unterstützt reaktive Benachrichtigungen (Live Objects), Verschlüsselung im laufenden Betrieb und Plattformübergreifend (Android, iOS, Flutter, React Native). Nachteile: größere APK/IPA-Größe und höherer Speicherverbrauch.
Für die Speicherung kleiner Datenmengen (Einstellungen, Token, Cache) werden einfache Schlüssel-Wert-Speicher verwendet.
SharedPreferences ist ein veralteter Schlüssel-Wert-Speicher in Android. Nachteile: synchroner Zugriff (blockiert die UI beim Lesen), fehlende Typisierung, ANR-Risiko beim Laden großer Dateien. NICHT für neue Projekte empfohlen.
DataStore ist der moderne Ersatz für SharedPreferences von Google. Es arbeitet asynchron über Kotlin Coroutines und Flow, unterstützt Preferences DataStore (Schlüssel-Wert) und Proto DataStore (typisierte Daten über Protobuf). DataStore ist sicher für den UI-Thread und unterstützt Transaktionen.
UserDefaults ist der Standardspeicher für kleine Einstellungen in iOS. Es unterstützt primitive Typen, Zeichenketten, Daten und Data. UserDefaults ist synchron und daher nicht für große Datenmengen geeignet. Die Registrierung von Werten über register(defaults:) legt Standardwerte fest.
Für die Datenspeicherung in Anwendungen, die eine Synchronisierung zwischen Geräten erfordern, werden Firebase-Cloud-Datenbanken verwendet.
Firebase Firestore ist eine NoSQL-Dokumentendatenbank mit Echtzeit-Abonnements, automatischer Skalierung, leistungsstarken Abfragen und integriertem Offline-Modus. Daten werden in Sammlungen und Dokumenten (JSON-ähnliche Strukturen) organisiert. Firestore unterstützt Transaktionen und Batch-Operationen. Ideal für Chats, Feeds und soziale Apps.
Firebase Realtime Database ist eine ältere Firebase-NoSQL-Datenbank, die Daten als einzelnen JSON-Baum speichert. Einfacher als Firestore, aber weniger flexibel bei Abfragen und Skalierung. Empfohlen für einfache Echtzeitanwendungen (Online-Status, einfache Chats).
| Merkmal | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| Datenmodell | Sammlungen → Dokumente | JSON-Baum |
| Abfragen | Komplex (Filtern, Sortieren, Grenzen) | Einfach (nach Schlüssel) |
| Skalierung | Automatisch | Manuelles Sharding |
| Offline-Modus | Ja (persistenter Cache) | Ja |
| Preis | Pro Lese-/Schreiboperation | Pro Traffic + Speicher |
Die Speicherung von Token, Passwörtern und Verschlüsselungsschlüsseln erfordert spezielle geschützte Speicher.
Android Keystore ist ein Systemspeicher für kryptografische Schlüssel. Schlüssel werden in einer Hardware-Umgebung (TEE — Trusted Execution Environment) gespeichert, die für Apps und das Betriebssystem unzugänglich ist. Unterstützt Schlüsselgenerierung, Verschlüsselung und Signierung. Ab Android 9+ mit StrongBox Keymaster (dedizierter Chip).
Keychain Services ist ein sicherer iOS-Speicher für Passwörter, Schlüssel und Zertifikate. Daten werden mit der Hardware Secure Enclave verschlüsselt. Keychain unterstützt Zugänglichkeitsstufen: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.
EncryptedSharedPreferences ist ein Wrapper um SharedPreferences mit Schlüssel- und Wertverschlüsselung über AES256-GCM und HKDF. Implementiert in der AndroidX Security Bibliothek. Empfohlen für die Speicherung von Token und vertraulichen Einstellungen.
Bei IT Sectr verwenden wir Android Keystore + EncryptedSharedPreferences zur Speicherung von Aktualisierungstoken und biometriebasierten Schlüsseln. Auf iOS verwenden wir Keychain mit der Stufe kSecAttrAccessibleWhenUnlockedThisDeviceOnly für maximale Sicherheit.
Für die Dateispeicherung (Bilder, Videos, Dokumente) bieten mobile Plattformen verschiedene Speichertypen.
Android unterscheidet zwischen Internal Storage (/data/data/package/ — privater Speicher) und External Storage (SD-Karte oder emulierte Partition). Cache Directory ist temporärer Speicher, den das System löschen kann. Scoped Storage (Android 10+) schränkt den Zugriff auf External Storage ein — Apps sehen nur ihre eigenen Dateien oder Dateien über MediaStore/SAF.
iOS bietet Documents Directory (iCloud-Backup, persistente Daten), Library/Caches (temporäre Dateien, kein Backup) und Tmp Directory (temporär, löschbar). Verwenden Sie NSFileManager für die Arbeit mit dem Dateisystem. iOS 11+ unterstützt File Provider für Cloud-Dateien.
Serialisierung konvertiert Objekte in ein Format für die Übertragung oder Speicherung. Deserialisierung ist der umgekehrte Prozess.
JSON (JavaScript Object Notation) ist das beliebteste Format: lesbar, flexibel, von allen Plattformen unterstützt. XML ist strenger, wird in Legacy-Systemen verwendet. Protobuf (Protocol Buffers) ist ein binäres Format von Google: 3-10x kompakter als JSON, schneller zu parsen, mit striktem Schema. Wird für Hochlastsysteme und Mikrodienste verwendet.
JSONSerialization ist die integrierte API für die Arbeit mit JSON. Codable (Encodable/Decodable) ist ein modernes Swift-Protokoll für die automatische Serialisierung in JSON, Property List und andere Formate.
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 und React Native gibt es eigene effiziente Speicherbibliotheken.
Hive ist ein leichter, schneller Schlüssel-Wert-Speicher für Flutter. Benötigt keinen nativen Code (reines Dart), unterstützt Typisierung über TypeAdapter und arbeitet in Isolaten. Ideal für Cache, Einstellungen und kleine Datenmengen.
ObjectBox ist eine hochleistungsfähige eingebettete Datenbank für Flutter, Android und iOS. Sie ist 10x schneller als SQLite und verwendet eine flache Dateistruktur für minimalen Overhead. Unterstützt Beziehungen, Abfragen und reaktive Abonnements (ObjectBox Dart).
Drift ist eine reaktive SQLite-Bibliothek für Flutter und Dart. Sie bietet typsichere Abfragen, Migrationen, DAO-Funktionen und Stream-Unterstützung (reaktive Aktualisierungen). Drift ist die erste Wahl für Flutter-Projekte, die SQLite benötigen.
Häufig gestellte Fragen
Die Wahl hängt von der Plattform ab: Room (Android) ist die offizielle SQLite-basierte Bibliothek mit Kompilierzeit-Prüfung. Core Data (iOS) ist Apples Framework mit Objektgraph. Für plattformübergreifende Projekte sind Realm oder SQLite über ORM geeignet.
SharedPreferences ist eine alte Implementierung mit synchronem Zugriff und ANR-Risiko. DataStore (Jetpack) ist ein moderner Ersatz auf Basis von Kotlin Coroutines und Flow, der Asynchronität, Typisierung und Fehlerschutz unterstützt.
Android: EncryptedSharedPreferences oder Android Keystore. iOS: Keychain Services mit Zugänglichkeit WhenUnlockedThisDeviceOnly. Für kritische Daten verwenden Sie Secure Enclave (iOS) und Hardware-Keystore (Android) mit Biometrie.
Cloud Firestore ist eine NoSQL-Datenbank von Firebase mit Echtzeitsynchronisierung, Offline-Modus und automatischer Skalierung. Geeignet für Chats, Nachrichtenfeeds und Projekte, die eine Synchronisierung zwischen Geräten benötigen.
Flutter: Hive (schneller Schlüssel-Wert), Floor (SQLite ORM), Drift (Moor, reaktives SQLite), ObjectBox (hochleistungsfähige eingebettete DB). React Native: Realm, WatermelonDB (Lazy Loading) und AsyncStorage (Analog zu SharedPreferences).
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.