Ang pag-iimbak ng data ay isa sa mga pangunahing gawain ng isang mobile application, na nakakaapekto sa performance, seguridad at karanasan ng gumagamit. Sa artikulong ito, tatalakayin natin ang SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore at Keychain, pati na rin ang mga format ng serialization (JSON, Protobuf) at mga library (Gson, Moshi, kotlinx.serialization). Ang gabay na ito ay makakatulong sa mga baguhang developer na pumili ng tamang solusyon sa pag-iimbak ng data. Matuto pa sa opisyal na gabay ng Android sa pag-iimbak ng data.
Mga Pangunahing Punto
Para sa pag-iimbak ng nakaayos na data na may mga relasyon sa pagitan ng mga entity, ginagamit ang mga relational database.
SQLite ay isang naka-embed na relational database na gumagana sa anumang mobile platform. Hindi nangangailangan ng hiwalay na server, ang data ay naka-imbak sa isang file. Ang SQLite ay ang pundasyon para sa Room (Android) at opsyonal para sa Core Data (iOS). Mga library: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).
Room ay ang opisyal na Android Architecture Components library para sa pagtatrabaho sa SQLite. Nagbibigay ng ORM layer: Entity (talahanayan), DAO (query), Database (entry point). Sinusuri ng Room ang SQL query sa oras ng compilation, sumusuporta sa coroutine at Flow, at awtomatikong nagmi-migrate ng 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 ay framework ng Apple para sa pamamahala ng object graph. Hindi ito purong database — ito ay isang persistence layer sa ibabaw ng SQLite, XML o binary storage. Pinamamahalaan ng Core Data ang mga bagay (NSManagedObject), relasyon, schema versioning, undo/redo, at multithreading sa pamamagitan ng NSManagedObjectContext.
Realm ay isang alternatibo sa SQLite, na dinisenyo bilang isang high-performance mobile database. Ang Realm ay mas mabilis kaysa SQLite sa pagbasa at pagsulat, sumusuporta sa reactive notifications (Live Objects), on-the-fly encryption, at cross-platform (Android, iOS, Flutter, React Native). Mga disbentaha: mas malaking sukat ng APK/IPA at mas mataas na paggamit ng memory.
Para sa pag-iimbak ng maliit na halaga ng data (mga setting, token, cache), ginagamit ang mga simpleng key-value store.
SharedPreferences ay isang legacy key-value store sa Android. Mga disbentaha: synchronous access (naba-block ang UI sa pagbasa), kakulangan ng typing, panganib ng ANR kapag nag-load ng malaking file. HINDI inirerekomenda para sa mga bagong proyekto.
DataStore ay ang modernong kapalit ng SharedPreferences mula sa Google. Gumagana nang asynchronous sa pamamagitan ng Kotlin Coroutines at Flow, sumusuporta sa Preferences DataStore (key-value) at Proto DataStore (typed data sa pamamagitan ng Protobuf). Ang DataStore ay ligtas para sa UI thread at sumusuporta sa mga transaksyon.
UserDefaults ay ang karaniwang imbakan para sa maliliit na setting sa iOS. Sumusuporta sa mga primitive type, string, petsa, Data. Ang UserDefaults ay synchronous, kaya hindi angkop para sa malalaking volume ng data. Ang pagrehistro ng mga halaga sa pamamagitan ng register(defaults:) ay nagtatakda ng mga default na halaga.
Para sa pag-iimbak ng data sa mga application na nangangailangan ng synchronization sa pagitan ng mga device, ginagamit ang Firebase cloud database.
Firebase Firestore ay isang NoSQL document database na may real-time subscription, awtomatikong scaling, malalakas na query, at built-in na offline mode. Ang data ay nakaayos sa mga collection at dokumento (mga istrakturang kahawig ng JSON). Sinusuportahan ng Firestore ang mga transaksyon at batch operation. Mainam para sa mga chat, feed, at social app.
Firebase Realtime Database ay isang mas lumang Firebase NoSQL database na nag-iimbak ng data bilang isang JSON tree. Mas simple kaysa Firestore ngunit hindi gaanong flexible sa query at scaling. Inirerekomenda para sa mga simpleng real-time application (online status, simpleng chat).
| Tampok | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| Modelo ng data | Collection → Dokumento | JSON tree |
| Query | Kompleks (pagsala, pag-uuri, limitasyon) | Simple (ayon sa key) |
| Scaling | Awtomatiko | Manual sharding |
| Offline mode | Oo (persistent cache) | Oo |
| Presyo | Bawat read/write operation | Bawat trapiko + imbakan |
Ang pag-iimbak ng mga token, password at encryption key ay nangangailangan ng espesyal na protektadong imbakan.
Android Keystore ay isang system storage para sa cryptographic key. Ang mga key ay naka-imbak sa isang hardware environment (TEE — Trusted Execution Environment), hindi naa-access ng mga app at OS. Sumusuporta sa key generation, encryption, at signing. Android 9+ ay may StrongBox Keymaster (dedicated chip).
Keychain Services ay isang secure na iOS storage para sa mga password, key, at certificate. Ang data ay naka-encrypt gamit ang hardware Secure Enclave. Sinusuportahan ng Keychain ang mga antas ng accessibility: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.
EncryptedSharedPreferences ay isang wrapper sa paligid ng SharedPreferences na may key at value encryption sa pamamagitan ng AES256-GCM at HKDF. Naipatupad sa AndroidX Security library. Inirerekomenda para sa pag-iimbak ng mga token at sensitibong setting.
Sa IT Sectr, gumagamit kami ng Android Keystore + EncryptedSharedPreferences para sa pag-iimbak ng refresh token at biometric-based key. Sa iOS, gumagamit kami ng Keychain na may antas na kSecAttrAccessibleWhenUnlockedThisDeviceOnly para sa maximum na seguridad.
Para sa pag-iimbak ng file (mga larawan, video, dokumento), ang mga mobile platform ay nagbibigay ng ilang uri ng imbakan.
Ang Android ay nag-iiba sa pagitan ng Internal Storage (/data/data/package/ — pribadong imbakan) at External Storage (SD card o emulated partition). Ang Cache Directory ay pansamantalang imbakan na maaaring linisin ng system. Ang Scoped Storage (Android 10+) ay naglilimita ng access sa External Storage — ang mga app ay nakakakita lamang ng kanilang sariling mga file o mga file sa pamamagitan ng MediaStore/SAF.
Ang iOS ay nagbibigay ng Documents Directory (iCloud backup, persistent data), Library/Caches (pansamantalang file, hindi naba-back up) at Tmp Directory (pansamantala, maaaring linisin). Gamitin ang NSFileManager para sa pagtatrabaho sa file system. iOS 11+ ay sumusuporta sa File Provider para sa mga cloud file.
Ang serialization ay nagko-convert ng mga bagay sa isang format para sa paghahatid o pag-iimbak. Ang deserialization ay ang kabaligtaran na proseso.
JSON (JavaScript Object Notation) ay ang pinakasikat na format: nababasa, flexible, suportado ng lahat ng platform. XML ay mas mahigpit, ginagamit sa mga legacy system. Protobuf (Protocol Buffers) ay isang binary format mula sa Google: 3-10x mas compact kaysa JSON, mas mabilis mag-parse, na may mahigpit na schema. Ginagamit para sa high-load system at microservice.
JSONSerialization ay ang built-in na API para sa pagtatrabaho sa JSON. Codable (Encodable/Decodable) ay isang modernong Swift protocol para sa awtomatikong serialization sa JSON, Property List at iba pang format.
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)
Para sa Flutter at React Native, may mga sariling mahusay na storage library.
Hive ay isang magaan, mabilis na key-value store para sa Flutter. Hindi nangangailangan ng native code (purong Dart), sumusuporta sa typing sa pamamagitan ng TypeAdapter, at gumagana sa isolates. Mainam para sa cache, setting, at maliit na volume ng data.
ObjectBox ay isang high-performance embedded database para sa Flutter, Android at iOS. 10+ beses na mas mabilis kaysa SQLite, gumagamit ng flat file structure para sa minimal na overhead. Sumusuporta sa relasyon, query, at reactive subscription (ObjectBox Dart).
Drift ay isang reactive SQLite library para sa Flutter at Dart. Nagbibigay ng type-safe query, migration, DAO function, at Stream support (reactive update). Ang Drift ay ang pangunahing pagpipilian para sa Flutter project na nangangailangan ng SQLite.
Mga Madalas Itanong
Ang pagpili ay depende sa platform: Room (Android) ay ang opisyal na library na nakabatay sa SQLite na may compile-time query checking. Core Data (iOS) ay framework ng Apple na may object graph. Para sa cross-platform project, ang Realm o SQLite sa pamamagitan ng ORM ay angkop.
Ang SharedPreferences ay lumang implementation na may synchronous access at ANR risk. DataStore (Jetpack) ay modernong kapalit na batay sa Kotlin Coroutines at Flow, sumusuporta sa asynchrony, typing, at error protection.
Android: EncryptedSharedPreferences o Android Keystore. iOS: Keychain Services na may accessibility na WhenUnlockedThisDeviceOnly. Para sa kritikal na data, gamitin ang Secure Enclave (iOS) at hardware Keystore (Android) na may biometrics.
Cloud Firestore ay isang NoSQL database mula sa Firebase na may real-time synchronization, offline mode at automatic scaling. Angkop para sa mga chat, news feed at proyekto na nangangailangan ng synchronization sa pagitan ng device.
Flutter: Hive (mabilis na key-value), Floor (SQLite ORM), Drift (Moor, reactive SQLite), ObjectBox (high-performance embedded DB). React Native: Realm, WatermelonDB (lazy loading) at AsyncStorage (katulad ng SharedPreferences).
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.