Η αποθήκευση δεδομένων είναι μία από τις βασικές εργασίες μιας εφαρμογής κινητού, που επηρεάζει την απόδοση, την ασφάλεια και την εμπειρία χρήστη. Σε αυτό το άρθρο θα καλύψουμε τα SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore και Keychain, καθώς και μορφές σειριοποίησης (JSON, Protobuf) και βιβλιοθήκες (Gson, Moshi, kotlinx.serialization). Αυτός ο οδηγός θα βοηθήσει αρχάριους προγραμματιστές να επιλέξουν τη σωστή λύση αποθήκευσης δεδομένων. Περισσότερα στον επίσημο οδηγό Android για αποθήκευση δεδομένων.
Βασικά σημεία
Για την αποθήκευση δομημένων δεδομένων με σχέσεις μεταξύ οντοτήτων χρησιμοποιούνται σχεσιακές βάσεις δεδομένων.
SQLite είναι μια ενσωματωμένη σχεσιακή βάση δεδομένων που λειτουργεί σε οποιαδήποτε πλατφόρμα κινητού. Δεν απαιτεί ξεχωριστό διακομιστή, τα δεδομένα αποθηκεύονται σε ένα αρχείο. Η SQLite είναι η βάση για το Room (Android) και προαιρετικά για το Core Data (iOS). Βιβλιοθήκες: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).
Room είναι η επίσημη βιβλιοθήκη Android Architecture Components για εργασία με SQLite. Παρέχει ένα επίπεδο ORM: Entity (πίνακας), DAO (ερωτήματα), Database (σημείο εισόδου). Το Room ελέγχει τα ερωτήματα SQL κατά τη μεταγλώττιση, υποστηρίζει coroutines και Flow και μεταφέρει αυτόματα το σχήμα.
@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 είναι το πλαίσιο της Apple για διαχείριση γράφου αντικειμένων. Δεν είναι καθαρή βάση δεδομένων — είναι ένα επίπεδο διατήρησης πάνω από SQLite, XML ή δυαδική αποθήκευση. Το Core Data διαχειρίζεται αντικείμενα (NSManagedObject), σχέσεις, εκδόσεις σχήματος, αναίρεση/επανάληψη και πολυνηματικότητα μέσω NSManagedObjectContext.
Realm είναι μια εναλλακτική λύση για την SQLite, σχεδιασμένη ως βάση δεδομένων κινητού υψηλής απόδοσης. Το Realm είναι ταχύτερο από την SQLite στην ανάγνωση και εγγραφή, υποστηρίζει αντιδραστικές ειδοποιήσεις (Live Objects), κρυπτογράφηση εν κινήσει και cross-platform (Android, iOS, Flutter, React Native). Μειονεκτήματα: αυξημένο μέγεθος APK/IPA και μεγαλύτερη κατανάλωση μνήμης.
Για την αποθήκευση μικρών ποσοτήτων δεδομένων (ρυθμίσεις, token, προσωρινή μνήμη) χρησιμοποιούνται απλές αποθηκεύσεις ζευγών κλειδιού-τιμής.
SharedPreferences είναι μια παλαιότερη αποθήκευση ζευγών κλειδιού-τιμής στο Android. Μειονεκτήματα: σύγχρονη πρόσβαση (μπλοκάρει το UI κατά την ανάγνωση), έλλειψη τύπων, κίνδυνος ANR κατά τη φόρτωση μεγάλου αρχείου. ΔΕΝ συνιστάται για νέα έργα.
DataStore είναι η σύγχρονη αντικατάσταση των SharedPreferences από την Google. Λειτουργεί ασύγχρονα μέσω Kotlin Coroutines και Flow, υποστηρίζει Preferences DataStore (κλειδί-τιμή) και Proto DataStore (τυποποιημένα δεδομένα μέσω Protobuf). Το DataStore είναι ασφαλές για το νήμα UI και υποστηρίζει συναλλαγές.
UserDefaults είναι η τυπική αποθήκευση για μικρές ρυθμίσεις στο iOS. Υποστηρίζει πρωτόγονους τύπους, συμβολοσειρές, ημερομηνίες, Data. Το UserDefaults είναι σύγχρονο, επομένως δεν είναι κατάλληλο για μεγάλους όγκους δεδομένων. Η εγγραφή τιμών μέσω register(defaults:) ορίζει προεπιλεγμένες τιμές.
Για αποθήκευση δεδομένων σε εφαρμογές που απαιτούν συγχρονισμό μεταξύ συσκευών, χρησιμοποιούνται βάσεις δεδομένων cloud Firebase.
Firebase Firestore είναι μια βάση δεδομένων εγγράφων NoSQL με συνδρομές σε πραγματικό χρόνο, αυτόματη κλιμάκωση, ισχυρά ερωτήματα και ενσωματωμένη λειτουργία εκτός σύνδεσης. Τα δεδομένα οργανώνονται σε συλλογές και έγγραφα (δομές που μοιάζουν με JSON). Το Firestore υποστηρίζει συναλλαγές και μαζικές λειτουργίες. Ιδανικό για συνομιλίες, ροές και κοινωνικές εφαρμογές.
Firebase Realtime Database είναι μια παλαιότερη βάση δεδομένων NoSQL Firebase που αποθηκεύει δεδομένα ως ένα μόνο δέντρο JSON. Απλούστερη από το Firestore αλλά λιγότερο ευέλικτη σε ερωτήματα και κλιμάκωση. Συνιστάται για απλές εφαρμογές πραγματικού χρόνου (online κατάσταση, απλές συνομιλίες).
| Χαρακτηριστικό | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| Μοντέλο δεδομένων | Συλλογές → Έγγραφα | Δέντρο JSON |
| Ερωτήματα | Πολύπλοκα (φιλτράρισμα, ταξινόμηση, όρια) | Απλά (κατά κλειδί) |
| Κλιμάκωση | Αυτόματη | Χειροκίνητη κατανομή |
| Λειτουργία εκτός σύνδεσης | Ναι (μόνιμη προσωρινή μνήμη) | Ναι |
| Τιμή | Ανά λειτουργία ανάγνωσης/εγγραφής | Ανά κίνηση + αποθήκευση |
Η αποθήκευση token, κωδικών πρόσβασης και κλειδιών κρυπτογράφησης απαιτεί ειδικές προστατευμένες αποθηκεύσεις.
Android Keystore είναι μια αποθήκευση συστήματος για κρυπτογραφικά κλειδιά. Τα κλειδιά αποθηκεύονται σε περιβάλλον υλικού (TEE — Trusted Execution Environment), μη προσβάσιμο από εφαρμογές και λειτουργικό σύστημα. Υποστηρίζει δημιουργία κλειδιών, κρυπτογράφηση και υπογραφή. Android 9+ περιλαμβάνει StrongBox Keymaster (αποκλειστικό τσιπ).
Keychain Services είναι μια ασφαλής αποθήκευση iOS για κωδικούς πρόσβασης, κλειδιά και πιστοποιητικά. Τα δεδομένα κρυπτογραφούνται χρησιμοποιώντας το υλικό Secure Enclave. Το Keychain υποστηρίζει επίπεδα προσβασιμότητας: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.
EncryptedSharedPreferences είναι ένα περιτύλιγμα γύρω από τα SharedPreferences με κρυπτογράφηση κλειδιών και τιμών μέσω AES256-GCM και HKDF. Υλοποιημένο στη βιβλιοθήκη AndroidX Security. Συνιστάται για αποθήκευση token και ευαίσθητων ρυθμίσεων.
Στην IT Sectr, χρησιμοποιούμε Android Keystore + EncryptedSharedPreferences για αποθήκευση token ανανέωσης και βιομετρικών κλειδιών. Στο iOS, χρησιμοποιούμε Keychain με επίπεδο kSecAttrAccessibleWhenUnlockedThisDeviceOnly για μέγιστη ασφάλεια.
Για αποθήκευση αρχείων (εικόνες, βίντεο, έγγραφα), οι πλατφόρμες κινητών παρέχουν διάφορους τύπους αποθήκευσης.
Το Android διακρίνει μεταξύ Internal Storage (/data/data/πακέτο/ — ιδιωτική αποθήκευση) και External Storage (κάρτα SD ή εξομοιωμένο διαμέρισμα). Το Cache Directory είναι προσωρινή αποθήκευση που το σύστημα μπορεί να καθαρίσει. Το Scoped Storage (Android 10+) περιορίζει την πρόσβαση στο External Storage — οι εφαρμογές βλέπουν μόνο τα δικά τους αρχεία ή αρχεία μέσω MediaStore/SAF.
Το iOS παρέχει Documents Directory (αντίγραφο ασφαλείας iCloud, μόνιμα δεδομένα), Library/Caches (προσωρινά αρχεία, χωρίς αντίγραφο ασφαλείας) και Tmp Directory (προσωρινά, μπορούν να καθαριστούν). Χρησιμοποιήστε το NSFileManager για εργασία με το σύστημα αρχείων. iOS 11+ υποστηρίζει File Provider για αρχεία cloud.
Η σειριοποίηση μετατρέπει αντικείμενα σε μορφή για μετάδοση ή αποθήκευση. Η αποσειριοποίηση είναι η αντίστροφη διαδικασία.
JSON (JavaScript Object Notation) είναι η πιο δημοφιλής μορφή: αναγνώσιμη, ευέλικτη, υποστηρίζεται από όλες τις πλατφόρμες. XML είναι πιο αυστηρή, χρησιμοποιείται σε παλαιότερα συστήματα. Protobuf (Protocol Buffers) είναι μια δυαδική μορφή από την Google: 3-10 φορές πιο συμπαγής από JSON, ταχύτερη ανάλυση, με αυστηρό σχήμα. Χρησιμοποιείται για συστήματα υψηλού φορτίου και μικροϋπηρεσίες.
JSONSerialization είναι το ενσωματωμένο API για εργασία με JSON. Codable (Encodable/Decodable) είναι ένα σύγχρονο πρωτόκολλο Swift για αυτόματη σειριοποίηση σε JSON, Property List και άλλες μορφές.
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)
Για Flutter και React Native υπάρχουν δικές τους αποτελεσματικές βιβλιοθήκες αποθήκευσης.
Hive είναι μια ελαφριά, γρήγορη αποθήκευση κλειδιού-τιμής για Flutter. Δεν απαιτεί εγγενή κώδικα (καθαρό Dart), υποστηρίζει τύπους μέσω TypeAdapter και λειτουργεί σε απομονωτές. Ιδανικό για προσωρινή μνήμη, ρυθμίσεις και μικρούς όγκους δεδομένων.
ObjectBox είναι μια ενσωματωμένη βάση δεδομένων υψηλής απόδοσης για Flutter, Android και iOS. Είναι 10+ φορές ταχύτερη από την SQLite, χρησιμοποιεί επίπεδη δομή αρχείων για ελάχιστη επιβάρυνση. Υποστηρίζει σχέσεις, ερωτήματα και αντιδραστικές συνδρομές (ObjectBox Dart).
Drift είναι μια αντιδραστική βιβλιοθήκη SQLite για Flutter και Dart. Παρέχει ασφαλή ερωτήματα τύπου, μεταναστεύσεις, λειτουργίες DAO και υποστήριξη Stream (αντιδραστικές ενημερώσεις). Το Drift είναι η κύρια επιλογή για έργα Flutter που απαιτούν SQLite.
Συχνές Ερωτήσεις
Η επιλογή εξαρτάται από την πλατφόρμα: Room (Android) είναι η επίσημη βιβλιοθήκη βασισμένη σε SQLite με έλεγχο ερωτημάτων κατά τη μεταγλώττιση. Core Data (iOS) είναι το πλαίσιο της Apple με γράφο αντικειμένων. Για έργα cross-platform, το Realm ή η SQLite μέσω ORM είναι κατάλληλα.
Τα SharedPreferences είναι παλιά υλοποίηση με σύγχρονη πρόσβαση και κίνδυνο ANR. DataStore (Jetpack) είναι μια σύγχρονη αντικατάσταση βασισμένη σε Kotlin Coroutines και Flow, που υποστηρίζει ασύγχρονη λειτουργία, τύπους και προστασία σφαλμάτων.
Android: EncryptedSharedPreferences ή Android Keystore. iOS: Keychain Services με προσβασιμότητα WhenUnlockedThisDeviceOnly. Για κρίσιμα δεδομένα, χρησιμοποιήστε Secure Enclave (iOS) και υλικό Keystore (Android) με βιομετρικά.
Cloud Firestore είναι μια βάση δεδομένων NoSQL από τη Firebase με συγχρονισμό σε πραγματικό χρόνο, λειτουργία εκτός σύνδεσης και αυτόματη κλιμάκωση. Κατάλληλο για συνομιλίες, ροές ειδήσεων και έργα που χρειάζονται συγχρονισμό μεταξύ συσκευών.
Flutter: Hive (γρήγορο κλειδί-τιμή), Floor (ORM SQLite), Drift (Moor, αντιδραστική SQLite), ObjectBox (ενσωματωμένη βάση δεδομένων υψηλής απόδοσης). React Native: Realm, WatermelonDB (τεμπέλικη φόρτωση) και AsyncStorage (ανάλογο SharedPreferences).
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.