Складиштење података у мобилном развоју: шта је то, методе и како функционише

Аутор: IT Sectr Објављено: 2026-03-08 Време читања: 9 мин

Складиштење података је један од кључних задатака мобилне апликације, који утиче на перформансе, безбедност и корисничко искуство. У овом чланку ћемо обрадити SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore и Keychain, као и формате серијализације (JSON, Protobuf) и библиотеке (Gson, Moshi, kotlinx.serialization). Овај водич ће помоћи почетницима да одаберу право решење за складиштење података. Више информација у званичном водичу Android за складиштење података.

Главне тачке

  • Room (Android) и Core Data (iOS) су званични ORM за рад са релационим базама података на свакој платформи
  • SharedPreferences (Android) се замењује са DataStore — асинхроним и типно безбедним складиштем кључ-вредност
  • За безбедно складиштење токена користе се Keystore (Android) и Keychain (iOS) са хардверском заштитом
  • Firebase Firestore је NoSQL база података са синхронизацијом у реалном времену и офлајн режимом
  • Серијализација — претварање објеката у JSON/Protobuf путем Gson, Moshi, kotlinx.serialization

Локалне базе података: SQLite, Room, Core Data, Realm

За складиштење структурираних података са односима између ентитета користе се релационе базе података.

SQLite

SQLite је уграђена релациона база података која ради на било којој мобилној платформи. Не захтева посебан сервер, подаци се чувају у једној датотеци. SQLite је основа за Room (Android) и опционо за Core Data (iOS). Библиотеке: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).

Room (Android)

Room је званична библиотека Android Architecture Components за рад са SQLite. Пружа ORM слој: Entity (табела), DAO (упити), Database (улазна тачка). Room проверава SQL упите у време компилације, подржава корутине и Flow и аутоматски мигрира шему.

kotlin
@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 (iOS)

Core Data је Apple-ов оквир за управљање графом објеката. Није чиста база података — то је слој перзистентности изнад SQLite, XML или бинарног складишта. Core Data управља објектима (NSManagedObject), односима, верзионисањем шеме, поништавањем/понављањем и радом са више нити кроз NSManagedObjectContext.

Realm

Realm је алтернатива SQLite-у, дизајнирана као високоперформансна мобилна база података. Realm је бржи од SQLite-а у читању и писању, подржава реактивна обавештења (Live Objects), шифровање у лету и вишеплатформност (Android, iOS, Flutter, React Native). Недостаци: повећана величина APK/IPA и већа потрошња меморије.

Складишта кључ-вредност и подешавања

За складиштење малих количина података (подешавања, токени, кеш) користе се једноставна складишта парова кључ-вредност.

SharedPreferences (Android)

SharedPreferences је застарело складиште парова кључ-вредност у Android-у. Недостаци: синхрони приступ (блокира UI при читању), недостатак типизације, ризик од ANR-а при учитавању велике датотеке. НИЈЕ препоручљиво за нове пројекте.

DataStore (Jetpack Android)

DataStore је модерна замена за SharedPreferences од Google-а. Ради асинхроно путем Kotlin Coroutines и Flow-а, подржава Preferences DataStore (кључ-вредност) и Proto DataStore (типизирани подаци путем Protobuf-а). DataStore је безбедан за UI нит и подржава трансакције.

NSUserDefaults (iOS)

UserDefaults је стандардно складиште за мала подешавања у iOS-у. Подржава примитивне типове, стрингове, датуме, Data. UserDefaults је синхрони, па није погодан за велике количине података. Регистрација вредности путем register(defaults:) поставља подразумеване вредности.

Облачне базе података: Firebase Firestore и Realtime DB

За складиштење података у апликацијама које захтевају синхронизацију између уређаја користе се Firebase облачне базе података.

Cloud Firestore

Firebase Firestore је NoSQL документациона база података са претплатама у реалном времену, аутоматским скалирањем, моћним упитима и уграђеним офлајн режимом. Подаци се организују у колекције и документе (структуре сличне JSON-у). Firestore подржава трансакције и групне операције. Идеално за четове, феедове и друштвене апликације.

Firebase Realtime Database

Firebase Realtime Database је старија Firebase NoSQL база података која чува податке као једно JSON стабло. Једноставнија од Firestore-а, али мање флексибилна у упитима и скалирању. Препоручује се за једноставне апликације у реалном времену (онлајн статус, једноставни четови).

КарактеристикаCloud FirestoreFirebase Realtime DB
Модел податакаКолекције → ДокументиJSON стабло
УпитиСложени (филтрирање, сортирање, границе)Једноставни (по кључу)
СкалирањеАутоматскоРучно шардовање
Офлајн режимДа (перзистентни кеш)Да
ЦенаПо операцијама читања/писањаПо саобраћају + складиштењу

Безбедно складиштење: Keystore, Keychain и EncryptedSharedPreferences

Складиштење токена, лозинки и кључева за шифровање захтева посебна заштићена складишта.

Android Keystore

Android Keystore је системско складиште за криптографске кључеве. Кључеви се чувају у хардверском окружењу (TEE — Trusted Execution Environment), недоступном апликацијама и оперативном систему. Подржава генерисање кључева, шифровање и потписивање. Android 9+ укључује StrongBox Keymaster (наменски чип).

iOS Keychain

Keychain Services је безбедно iOS складиште за лозинке, кључеве и сертификате. Подаци се шифрују помоћу хардверског Secure Enclave-а. Keychain подржава нивое доступности: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.

EncryptedSharedPreferences (Android)

EncryptedSharedPreferences је омотач око SharedPreferences-а са шифровањем кључева и вредности путем AES256-GCM и HKDF-а. Имплементиран у библиотеци AndroidX Security. Препоручује се за чување токена и осетљивих подешавања.

У IT Sectr-у користимо Android Keystore + EncryptedSharedPreferences за чување refresh токена и биометријских кључева. На iOS-у користимо Keychain са нивоом kSecAttrAccessibleWhenUnlockedThisDeviceOnly за максималну безбедност.

Датотечно складиштење: Internal, External, Cache Directory

За складиштење датотека (слике, видео, документи) мобилне платформе пружају неколико типова складишта.

Android Storage

Android разликује Internal Storage (/data/data/пакет/ — приватно складиште) и External Storage (SD картица или емулирана партиција). Cache Directory је привремено складиште које систем може очистити. Scoped Storage (Android 10+) ограничава приступ External Storage-у — апликације виде само своје датотеке или датотеке путем MediaStore/SAF-а.

iOS Storage

iOS пружа Documents Directory (iCloud резервна копија, трајни подаци), Library/Caches (привремене датотеке, без резервне копије) и Tmp Directory (привремене, могу се очистити). Користите NSFileManager за рад са датотечним системом. iOS 11+ подржава File Provider за облачне датотеке.

Серијализација података: JSON, Protobuf и библиотеке

Серијализација претвара објекте у формат за пренос или складиштење. Десеријализација је обрнут процес.

Формати

JSON (JavaScript Object Notation) је најпопуларнији формат: читљив, флексибилан, подржан од свих платформи. XML је строжи, користи се у застарелим системима. Protobuf (Protocol Buffers) је бинарни формат од Google-а: 3-10 пута компактнији од JSON-а, брже се парсира, има строгу шему. Користи се за системе високог оптерећења и микросервисе.

Android библиотеке

  • Gson (Google) — једноставан, флексибилан, али спор. Аутоматски ради са Java/Kotlin објектима
  • Moshi (Square) — бржи од Gson-а, боља подршка за Kotlin (не-нул својства, подразумеване вредности, sealed класе)
  • kotlinx.serialization — изворна Kotlin серијализација од JetBrains-а, ради у време компилације, подржава JSON, Protobuf, CBOR

iOS библиотеке

JSONSerialization је уграђени API за рад са JSON-ом. Codable (Encodable/Decodable) је модеран Swift протокол за аутоматску серијализацију у JSON, Property List и друге формате.

swift
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)

Вишеплатформска решења: Hive, ObjectBox, Drift

За Flutter и React Native постоје сопствене ефикасне библиотеке за складиштење.

Hive (Flutter)

Hive је лагано, брзо key-value складиште за Flutter. Не захтева изворни код (чисти Dart), подржава типизацију путем TypeAdapter-а и ради у изолатима. Идеално за кеш, подешавања и мале количине података.

ObjectBox

ObjectBox је високоперформансна уграђена база података за Flutter, Android и iOS. Бржа је од SQLite-а 10+ пута, користи равну структуру датотека за минимално оптерећење. Подржава односе, упите и реактивне претплате (ObjectBox Dart).

Drift (раније Moor)

Drift је реактивна SQLite библиотека за Flutter и Dart. Пружа типно безбедне упите, миграције, DAO функције и подршку за Stream (реактивна ажурирања). Drift је основни избор за Flutter пројекте који захтевају SQLite.

Често постављана питања

Шта је боље користити за локално складиштење података: Room или Core Data?

Избор зависи од платформе: Room (Android) је званична библиотека заснована на SQLite-у са провером упита у време компилације. Core Data (iOS) је Apple-ов оквир са графом објеката. За вишеплатформске пројекте одговара Realm или SQLite преко ORM-а.

Која је разлика између SharedPreferences и DataStore-а?

SharedPreferences је стара имплементација са синхроним приступом и ризиком од ANR-а. DataStore (Jetpack) је модерна замена заснована на Kotlin Coroutines и Flow-у, подржава асинхроност, типизацију и заштиту од грешака.

Како безбедно чувати токене и лозинке у мобилној апликацији?

Android: EncryptedSharedPreferences или Android Keystore. iOS: Keychain Services са нивоом доступности WhenUnlockedThisDeviceOnly. За критичне податке користите Secure Enclave (iOS) и хардверски Keystore (Android) са биометријом.

Шта је Firebase Firestore и када га треба користити?

Cloud Firestore је NoSQL база података од Firebase-а са синхронизацијом у реалном времену, офлајн режимом и аутоматским скалирањем. Погодна за четове, вести и пројекте који захтевају синхронизацију између уређаја.

Који ORM-ови постоје за Flutter и React Native?

Flutter: Hive (брзо кључ-вредност), Floor (SQLite ORM), Drift (Moor, реактивни SQLite), ObjectBox (високоперформансна уграђена БД). React Native: Realm, WatermelonDB (лења учитавања) и AsyncStorage (аналог SharedPreferences-а).

Резиме

  • Room (Android) и Core Data (iOS) су званична решења за релационе базе података на свакој платформи
  • DataStore замењује SharedPreferences за асинхроно складиштење подешавања
  • Keystore / Keychain су обавезни за безбедно складиштење токена и кључева
  • Firebase Firestore је најбољи избор за синхронизацију у реалном времену између уређаја
  • Kotlinx.serialization (Android) и Codable (iOS) су модерни приступи серијализацији
  • За Flutter: Drift (SQLite), Hive (кључ-вредност), ObjectBox (високе перформансе)
  • Realm је вишеплатформска алтернатива SQLite-у са реактивним обавештењима

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту