ذخیرهسازی داده یکی از وظایف کلیدی یک برنامه موبایل است که بر عملکرد، امنیت و تجربه کاربری تأثیر میگذارد. در این مقاله به بررسی 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 یک پایگاه داده NoSQL قدیمیتر Firebase است که دادهها را به صورت یک درخت 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 برای ذخیره توکنهای تازهسازی و کلیدهای بیومتریک استفاده میکنیم. در iOS از Keychain با سطح kSecAttrAccessibleWhenUnlockedThisDeviceOnly برای حداکثر امنیت استفاده میکنیم.
برای ذخیرهسازی فایل (تصاویر، ویدئوها، اسناد)، پلتفرمهای موبایل چندین نوع ذخیرهساز ارائه میدهند.
Android بین Internal Storage (/data/data/package/ — ذخیره خصوصی) و 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 یک ذخیرهساز کلید-مقدار سبک و سریع برای 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 با گراف اشیاء است. برای پروژههای چندسکویی، 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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.