ذخیره‌سازی داده در توسعه موبایل: چیست، چه روش‌هایی دارد و چگونه کار می‌کند

نویسنده: 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 یک پایگاه داده NoSQL قدیمی‌تر Firebase است که داده‌ها را به صورت یک درخت 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 برای ذخیره توکن‌های تازه‌سازی و کلیدهای بیومتریک استفاده می‌کنیم. در iOS از Keychain با سطح kSecAttrAccessibleWhenUnlockedThisDeviceOnly برای حداکثر امنیت استفاده می‌کنیم.

ذخیره‌سازی فایل: Internal، External، Cache Directory

برای ذخیره‌سازی فایل (تصاویر، ویدئوها، اسناد)، پلتفرم‌های موبایل چندین نوع ذخیره‌ساز ارائه می‌دهند.

Android Storage

Android بین Internal Storage (/data/data/package/ — ذخیره خصوصی) و 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 یک ذخیره‌ساز کلید-مقدار سبک و سریع برای Flutter است. به کد بومی نیاز ندارد (Dart خالص)، از تایپ از طریق TypeAdapter پشتیبانی می‌کند و در ایزوله‌ها کار می‌کند. ایده‌آل برای حافظه پنهان، تنظیمات و حجم‌های کوچک داده.

ObjectBox

ObjectBox یک پایگاه داده جاسازی‌شده با کارایی بالا برای Flutter، Android و iOS است. 10+ برابر سریع‌تر از SQLite است، از ساختار فایل تخت برای سربار حداقل استفاده می‌کند. از روابط، پرس‌وجوها و اشتراک‌های واکنشی (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 (ORM SQLite)، 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 از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه