ذخیرهسازی دائمی داده، حفظ اطلاعات کاربر بین جلسات کاری برنامه موبایل را تضمین میکند. بدون این فناوری، هر بار اجرای برنامه از صفر شروع میشد — تنظیمات، تاریخچه و فایلهای بارگیری شده هنگام بسته شدن از بین میرفتند. طبق دادههای Google Developers, 2024، بیش از 90٪ از برنامههای موبایل از حداقل یک مکانیزم ذخیرهسازی دائمی برای حفظ دادههای کاربر و وضعیت رابط استفاده میکنند.
نکات اصلی
Data Persistence — توانایی برنامه برای ذخیره داده در حافظه غیرفرار دستگاه است. در توسعه موبایل، ذخیرهسازی دائمی شامل پایگاههای داده، سیستم فایل، تنظیمات و حافظه پنهان میشود. هر مکانیزم ویژگیهای خاص خود را در زمینه عملکرد، امنیت و حجم اطلاعات ذخیره شده دارد.
دادههای موقت فقط در حافظه RAM وجود دارند و با پایان فرآیند از بین میروند. اینها شامل وضعیت صفحه، محاسبات موقت و حافظه پنهان تصاویر میشوند. دادههای دائمی در سیستم فایل یا پایگاه داده ذخیره میشوند و پس از راهاندازی مجدد برنامه قابل دسترسی باقی میمانند. اینها شامل تنظیمات کاربر، توکنهای احراز هویت، تاریخچه عملیات و محتوای بارگیری شده میشوند.
هنگام انتخاب روش ذخیرهسازی، توسعهدهنده چندین عامل را ارزیابی میکند. نوع داده ساختار ذخیرهسازی را تعیین میکند: تنظیمات ساده — SharedPreferences یا DataStore، رکوردهای ساختاریافته — SQLite یا Room، فایلها — File Storage. حجم داده بر عملکرد تأثیر میگذارد: پایگاههای داده برای هزاران رکورد بهینه شدهاند و فایلها برای اشیاء باینری بزرگ. امنیت نیاز به رمزگذاری اطلاعات حساس از طریق EncryptedSharedPreferences یا SQLCipher دارد.
data class StorageOption(
name: String,
dataType: StorageType,
capacity: Long,
secure: Boolean
)
enum class StorageType {
KEY_VALUE,
RELATIONAL,
FILE
}
SharedPreferences — روش کلاسیک ذخیره جفتهای کلید-مقدار در Android. این API از اولین نسخههای پلتفرم وجود دارد و از انواع اولیه پشتیبانی میکند: رشتهها، اعداد، مقادیر بولی. دادهها در فایل XML در دایرکتوری خصوصی برنامه ذخیره میشوند و فقط برای فرآیند آن قابل دسترسی هستند.
Jetpack DataStore — جایگزین مدرن SharedPreferences، ساخته شده بر پایه Kotlin Coroutines و Flow. DataStore دو گزینه ارائه میدهد: Preferences DataStore برای مقادیر ساده و Proto DataStore برای اشیاء تایپشده. برخلاف SharedPreferences، DataStore سازگاری داده را در دسترسی همزمان تضمین میکند و از عملیات ناهمگام بدون مسدود کردن نخ اصلی پشتیبانی میکند.
// SharedPreferences — روش سنتی
val prefs = context
.getSharedPreferences("settings", Context.MODE_PRIVATE)
with (prefs.edit()) {
putString("username", "john_doe")
putInt("score", 1500)
apply()
}
// DataStore — رویکرد ناهمگام
val settingsDataStore = context
.createDataStore("settings.pb")
val usernameFlow: Flow<String> = settingsDataStore
.data
.map { it[USERNAME_KEY] ?: "" }
در iOS معادل SharedPreferences UserDefaults — سیستم ذخیره مقادیر ساده در قالب Property List است. UserDefaults از دسترسی همزمان استفاده میکند و برای حجمهای کوچک دادههای پیکربندی مناسب است، اما برای ذخیره اطلاعات حساس توصیه نمیشود.
SQLite — پایگاه داده رابطهای جاسازیشده که در داخل فرآیند برنامه بدون سرور جداگانه کار میکند. این رایجترین DBMS در توسعه موبایل است: به طور پیشفرض در هر دو پلتفرم استفاده میشود. Android SQLite را در SDK و iOS آن را در کتابخانه libsqlite3 قرار میدهد. SQLite از SQL استاندارد، تراکنشها، ایندکسها و تریگرها پشتیبانی میکند.
کار با SQLite با ایجاد طرح پایگاه داده آغاز میشود. توسعهدهنده جداول، فیلدها و انواع آنها را تعریف میکند، سپس عملیات درج، خواندن، بهروزرسانی و حذف را انجام میدهد. SQLiteOpenHelper در Android ایجاد و مهاجرت پایگاه داده را مدیریت میکند و در iOS از رابط C یا wrapper FMDB استفاده میشود.
// SQLiteOpenHelper در Android
class DBHelper(context: Context) :
SQLiteOpenHelper(context, "app.db", null, 1) {
override fun onCreate(db: SQLiteDatabase) {
db.execSQL("""
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
)
""")
}
fun insertUser(name: String, email: String) {
val db = writableDatabase
val values = ContentValues().apply {
put("name", name)
put("email", email)
}
db.insert("users", null, values)
}
}
| نوع داده | SharedPreferences | SQLite | سیستم فایل |
|---|---|---|---|
| نوع | کلید-مقدار | پایگاه داده رابطهای | فایلهای باینری |
| حجم | صدها رکورد | هزاران رکورد | فضای موجود |
| عملکرد | بالا | متوسط | بستگی به اندازه دارد |
| کاربرد معمول | تنظیمات | دادههای ساختاریافته | تصاویر، ویدئو |
Room — کتابخانه از مجموعه Jetpack که لایه ORM روی SQLite ارائه میدهد. Room کار روتین نوشتن کوئریهای SQL و ContentValues را حذف میکند و آنها را با حاشیهنویسی و توابع Kotlin جایگزین میکند. کامپایلر Room پیادهسازی DAO (Data Access Object) را در مرحله ساخت تولید میکند که خطاهای نحو SQL را از بین میبرد.
برای اتصال Room باید وابستگی kapt را اضافه کرده و کلاس موجودیت، رابط DAO و کلاس پایگاه داده را حاشیهنویسی کرد. RoomDatabase به عنوان نقطه ورود عمل میکند: از طریق آن DAO دریافت میشود و عملیات روی پایگاه داده انجام میشود. Room از Flow برای کوئریهای واکنشی، مهاجرت طرح و بررسی کوئریها در مرحله کامپایل پشتیبانی میکند.
@Entity(tableName = "users")
data class User(
@PrimaryKey val id: Int,
@ColumnInfo(name = "full_name") val name: String,
@ColumnInfo val email: String
)
@Dao
interface UserDao {
@Query("SELECT * FROM users")
fun getAll(): Flow<List<User>>
@Insert
suspend fun insert(user: User)
@Delete
suspend fun delete(user: User)
}
@Database(
entities = [User::class],
version = 1
)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
Core Data — چارچوب Apple برای مدیریت گراف اشیاء و ذخیره آنها روی دیسک. برخلاف Room، Core Data با جداول کار نمیکند، بلکه با اشیاء مدیریتشده (NSManagedObject) کار میکند که سلسلهمراتب ارتباطات را تشکیل میدهند. Core Data از بارگذاری تنبل، لغو تغییرات و کوئریهای پیچیده از طریق NSFetchRequest پشتیبانی میکند.
پایه Core Data پشتهای از سه مؤلفه است: زمینه مدیریتشده (NSManagedObjectContext)، ذخیرهسازی دائمی (NSPersistentStoreCoordinator) و مدل داده (NSManagedObjectModel). NSPersistentContainer همه مؤلفهها را در یک نقطه ورود واحد ترکیب میکند و پیکربندی را برای برنامههای مدرن Swift ساده میکند.
import CoreData
class PersistenceController {
static let shared = PersistenceController()
let container: NSPersistentContainer
init() {
container = NSPersistentContainer(name: "AppModel")
container.loadPersistentStores { _, error in
if let error = error {
fatalError("Failed: \(error)")
}
}
}
func saveUser(name: String, email: String) {
let context = container.viewContext
let user = User(context: context)
user.name = name
user.email = email
do {
try context.save()
} catch let error {
print("خطای ذخیره: \(error)")
}
}
}
ذخیرهسازی فایل (File Storage) برای ذخیره تصاویر، ویدئوها و اسناد استفاده میشود. Android حافظه داخلی (context.filesDir) — خصوصی برای برنامه، و خارجی (Environment.getExternalStorageDirectory) — قابل دسترسی برای سایر برنامهها را فراهم میکند. در iOS فایلها در دایرکتوریهای Documents و Library ذخیره میشوند، و Library/Caches برای حافظه پنهانی در نظر گرفته شده است که در iCloud پشتیبانگیری نمیشود. برای کار با فایلها، هر دو پلتفرم File API و عملیات جریان خواندن و نوشتن را ارائه میدهند. کتابخانههای مدرنی مانند Coil و SDWebImage لایه ذخیرهسازی موقت را اضافه میکنند که ذخیرهسازی فایل را با RAM برای عملکرد بهینه ترکیب میکند.
در Android جایگزین Core Data از نظر پیچیدگی و عملکرد Realm — پایگاه داده شیءگرا است که مستقیماً با مدلها بدون لایه SQL کار میکند. Realm در عملیات خواندن سریعتر از SQLite است و از اشیاء زنده پشتیبانی میکند که رابط کاربری را هنگام تغییر داده بهطور خودکار بهروز میکنند.
سوالات متداول
Data Persistence — مکانیزمهای ذخیره داده در حافظه غیرفرار دستگاه است که دسترسی به آنها را پس از راهاندازی مجدد برنامه تضمین میکند. این شامل پایگاههای داده، ذخیرهسازی فایل و سیستمهای تنظیمات میشود.
Room یک لایه ORM روی SQLite است که نوشتن دستی کوئریهای SQL و ContentValues را حذف میکند. Room کوئریهای SQL را در مرحله کامپایل بررسی میکند، از Kotlin Coroutines و Flow پشتیبانی میکند و به طور خودکار کد دسترسی به داده را تولید میکند.
SharedPreferences برای ذخیره حجم کمی از دادههای ساده مناسب است: تنظیمات برنامه، پرچمها، شناسهها و اولویتهای کاربر. برای دادههای پیچیده یا ساختاریافته بهتر است از Room یا DataStore استفاده کنید.
Core Data — چارچوب Apple برای مدیریت گراف اشیاء. این چارچوب کار با اشیاء مدیریتشده، ردیابی تغییرات، بارگذاری تنبل و ذخیره خودکار در حافظه دائمی (SQLite، XML یا فرمت باینری) را فراهم میکند.
انتخاب به پیچیدگی داده بستگی دارد: برای تنظیمات — DataStore یا UserDefaults، برای رکوردهای ساختاریافته — Room (Android) یا Core Data (iOS)، برای فایلها — File Storage. معیارها شامل حجم داده، نیازهای عملکرد و نیاز به رمزگذاری هستند. ترکیب چندین مکانیزم در یک برنامه یک روش استاندارد است که امکان استفاده بهینه از نقاط قوت هر رویکرد را فراهم میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید