Складиштење података је један од кључних задатака мобилне апликације, који утиче на перформансе, безбедност и корисничко искуство. У овом чланку ћемо обрадити 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 упите у време компилације, подржава корутине и 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), шифровање у лету и вишеплатформност (Android, iOS, Flutter, React Native). Недостаци: повећана величина APK/IPA и већа потрошња меморије.
За складиштење малих количина података (подешавања, токени, кеш) користе се једноставна складишта парова кључ-вредност.
SharedPreferences је застарело складиште парова кључ-вредност у Android-у. Недостаци: синхрони приступ (блокира UI при читању), недостатак типизације, ризик од ANR-а при учитавању велике датотеке. НИЈЕ препоручљиво за нове пројекте.
DataStore је модерна замена за SharedPreferences од Google-а. Ради асинхроно путем Kotlin Coroutines и Flow-а, подржава Preferences DataStore (кључ-вредност) и Proto DataStore (типизирани подаци путем Protobuf-а). DataStore је безбедан за UI нит и подржава трансакције.
UserDefaults је стандардно складиште за мала подешавања у iOS-у. Подржава примитивне типове, стрингове, датуме, Data. UserDefaults је синхрони, па није погодан за велике количине података. Регистрација вредности путем register(defaults:) поставља подразумеване вредности.
За складиштење података у апликацијама које захтевају синхронизацију између уређаја користе се Firebase облачне базе података.
Firebase Firestore је NoSQL документациона база података са претплатама у реалном времену, аутоматским скалирањем, моћним упитима и уграђеним офлајн режимом. Подаци се организују у колекције и документе (структуре сличне JSON-у). Firestore подржава трансакције и групне операције. Идеално за четове, феедове и друштвене апликације.
Firebase Realtime Database је старија Firebase NoSQL база података која чува податке као једно JSON стабло. Једноставнија од Firestore-а, али мање флексибилна у упитима и скалирању. Препоручује се за једноставне апликације у реалном времену (онлајн статус, једноставни четови).
| Карактеристика | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| Модел података | Колекције → Документи | JSON стабло |
| Упити | Сложени (филтрирање, сортирање, границе) | Једноставни (по кључу) |
| Скалирање | Аутоматско | Ручно шардовање |
| Офлајн режим | Да (перзистентни кеш) | Да |
| Цена | По операцијама читања/писања | По саобраћају + складиштењу |
Складиштење токена, лозинки и кључева за шифровање захтева посебна заштићена складишта.
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. Препоручује се за чување токена и осетљивих подешавања.
У IT Sectr-у користимо Android Keystore + EncryptedSharedPreferences за чување refresh токена и биометријских кључева. На 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 за облачне датотеке.
Серијализација претвара објекте у формат за пренос или складиштење. Десеријализација је обрнут процес.
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 је лагано, брзо key-value складиште за Flutter. Не захтева изворни код (чисти Dart), подржава типизацију путем TypeAdapter-а и ради у изолатима. Идеално за кеш, подешавања и мале количине података.
ObjectBox је високоперформансна уграђена база података за Flutter, Android и iOS. Бржа је од SQLite-а 10+ пута, користи равну структуру датотека за минимално оптерећење. Подржава односе, упите и реактивне претплате (ObjectBox Dart).
Drift је реактивна SQLite библиотека за Flutter и Dart. Пружа типно безбедне упите, миграције, DAO функције и подршку за Stream (реактивна ажурирања). Drift је основни избор за Flutter пројекте који захтевају SQLite.
Често постављана питања
Избор зависи од платформе: Room (Android) је званична библиотека заснована на SQLite-у са провером упита у време компилације. Core Data (iOS) је Apple-ов оквир са графом објеката. За вишеплатформске пројекте одговара 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 (SQLite ORM), Drift (Moor, реактивни SQLite), ObjectBox (високоперформансна уграђена БД). React Native: Realm, WatermelonDB (лења учитавања) и AsyncStorage (аналог SharedPreferences-а).
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.