نمای کلی ذخیره‌سازی داده‌ها و فایل‌ها

Android از سیستم فایلی استفاده می‌کند که مشابه سیستم‌های فایل مبتنی بر دیسک در پلاتفرم‌های دیگر است. سیستم چندین گزینه برای ذخیره کردن داده‌های برنامه دراختیارتان قرار می‌دهد:

  • فضای ذخیره‌سازی مختص برنامه: فایل‌هایی را که فقط برای استفاده برنامه‌تان درنظر گرفته شده‌اند، در دایرکتوری‌های اختصاصی در فضای ذخیره‌سازی داخلی یا دایرکتوری‌های اختصاصی متفاوت در فضای ذخیره‌سازی خارجی ذخیره کنید. از فهرست‌های راهنمای موجود در فضای ذخیره‌سازی داخلی برای ذخیره کردن اطلاعات حساسی که برنامه‌های دیگر نباید به آن‌ها دسترسی داشته باشند استفاده کنید.
  • فضای ذخیره‌سازی مشترک: فایل‌هایی را که برنامه‌تان قصد دارد با برنامه‌های دیگر هم‌رسانی کند، ازجمله رسانه‌ها، اسناد، و فایل‌های دیگر، ذخیره می‌کند.
  • اولویت‌ها: داده‌های خصوصی و اولیه را در جفت‌های کلید-مقدار ذخیره کنید.
  • پایگاه‌های داده: داده‌های ساختاریافته را بااستفاده از کتابخانه پایداری Room در پایگاه داده خصوصی ذخیره کنید.

ویژگی‌های این گزینه‌ها در جدول زیر خلاصه شده است:

نوع محتوا روش دسترسی اجازه لازم است آیا برنامه‌های دیگر می‌توانند دسترسی داشته باشند؟ آیا فایل‌ها با حذف نصب برنامه برداشته می‌شوند؟
فایل‌های مختص برنامه فایل‌هایی که فقط برای استفاده برنامه‌تان درنظر گرفته شده است از حافظه داخلی، getFilesDir() یا getCacheDir()

از حافظه خارجی، getExternalFilesDir() یا getExternalCacheDir()
هرگز برای فضای ذخیره‌سازی داخلی لازم نیست

برای فضای ذخیره‌سازی خارجی لازم نیست، وقتی برنامه‌تان در دستگاه‌هایی استفاده می‌شود که Android نسخه ۴.۴ (سطح API‏ ۱۹) یا بالاتر را اجرا می‌کنند
نه بله
رسانه فایل‌های رسانه‌ای قابل‌هم‌رسانی (تصاویر، فایل‌های صوتی، ویدیوها) میانای برنامه‌سازی کاربردی MediaStore READ_EXTERNAL_STORAGE هنگام دسترسی به فایل‌های برنامه‌های دیگر در Android 11 (سطح میانای برنامه‌سازی کاربردی 30) یا بالاتر

READ_EXTERNAL_STORAGE یا WRITE_EXTERNAL_STORAGE هنگام دسترسی به فایل‌های برنامه‌های دیگر در Android 10 (سطح میانای برنامه‌سازی کاربردی 29)

اجازه‌ها برای همه فایل‌ها در Android 9 (سطح میانای برنامه‌سازی کاربردی 28) یا پایین‌تر لازم است
بله، اما برنامه دیگر به اجازه READ_EXTERNAL_STORAGE نیاز دارد نه
اسناد و فایل‌های دیگر انواع دیگر محتوای قابل‌هم‌رسانی، ازجمله فایل‌های بارگیری‌شده چارچوب دسترسی به فضای ذخیره‌سازی هیچ‌کدام بله، ازطریق انتخاب‌گر فایل سیستم نه
اولویت‌های برنامه جفت‌های کلید-مقدار کتابخانه Jetpack Preferences هیچ‌کدام نه بله
پایگاه داده محلی داده‌های رابطه‌ای ساختاریافته در دستگاه کتابخانه پایداری Room‏ ۱ هیچ‌کدام نه بله
پایگاه‌های داده میزبانی‌شده در فضای ابری داده‌های همگام‌سازی‌شده چنددستگاهی، مشارکت هم‌زمان Cloud Firestore، Firebase SQL Connect INTERNET فقط بااستفاده از پسای ابری حافظه نهان SDK حذف شده است، اما داده‌های ابری باقی می‌ماند
فضای ذخیره‌سازی شیء میزبانی‌شده در ابر داده‌های بدون ساختار (مثل رسانه، فایل‌های بزرگ، یا نسخه‌های پشتیبان) فضای ذخیره‌سازی ابری ویژه Firebase INTERNET فقط بااستفاده از پسای ابری حافظه نهان SDK حذف شده است، اما داده‌های ابری باقی می‌ماند

۱ برای همگام‌سازی پایگاه‌های داده Room محلی در دستگاه‌ها، Room را با باطن ابری جفت کنید یا راه‌حل‌های همگام‌سازی مدیریت‌شده مانند Firebase را درنظر بگیرید.

راهکاری که انتخاب می‌کنید به نیازهای خاص شما بستگی دارد:

داده‌هایتان به چه مقدار فضا نیاز دارد؟
فضای ذخیره‌سازی داخلی فضای محدودی برای داده‌های مختص برنامه دارد. اگر لازم است مقدار قابل‌توجهی داده ذخیره کنید، از انواع دیگر فضای ذخیره‌سازی استفاده کنید.
دسترسی به داده‌ها چقدر باید قابل‌اعتماد باشد؟
اگر عملکرد اصلی برنامه‌تان به داده‌های خاصی نیاز دارد، مثلاً وقتی برنامه‌تان در حال راه‌اندازی است، داده‌ها را در دایرکتوری فضای ذخیره‌سازی داخلی یا پایگاه داده قرار دهید. فایل‌های مختص برنامه که در فضای ذخیره‌سازی خارجی ذخیره می‌شوند همیشه دردسترس نیستند چون برخی‌از دستگاه‌ها به کاربران اجازه می‌دهند دستگاه فیزیکی مربوط به فضای ذخیره‌سازی خارجی را بردارند.
چه نوع داده‌هایی را باید ذخیره کنید؟
اگر داده‌هایی دارید که فقط برای برنامه‌تان معنی‌دار است، از فضای ذخیره‌سازی مختص برنامه استفاده کنید. برای محتوای رسانه‌ای قابل‌هم‌رسانی، از فضای ذخیره‌سازی مشترک استفاده کنید تا برنامه‌های دیگر بتوانند به محتوا دسترسی داشته باشند. برای داده‌های ساختاریافته، از تنظیمات برگزیده (برای داده‌های کلید-مقدار) یا پایگاه داده (برای داده‌هایی که بیش‌از ۲ ستون دارند) استفاده کنید.
آیا داده‌ها باید برای برنامه‌تان خصوصی باشد؟
هنگام ذخیره کردن داده‌های حساس (داده‌هایی که نباید ازطریق هیچ برنامه دیگری قابل‌دسترسی باشد)، از فضای ذخیره‌سازی داخلی، اولویت‌ها، یا پایگاه داده استفاده کنید. حافظه داخلی این مزیت را دارد که داده‌ها از کاربران پنهان می‌شود.

دسته‌های مکان‌های ذخیره‌سازی

‫Android دو نوع مکان ذخیره‌سازی فیزیکی ارائه می‌دهد: فضای ذخیره‌سازی داخلی و فضای ذخیره‌سازی خارجی. در اکثر دستگاه‌ها، حافظه داخلی کوچک‌تر از حافظه خارجی است. بااین‌حال، فضای ذخیره‌سازی داخلی همیشه در همه دستگاه‌ها دردسترس است، که آن را به مکانی قابل‌اعتمادتر برای قرار دادن داده‌هایی که برنامه‌تان به آن‌ها وابسته است تبدیل می‌کند.

درایوهای جداشدنی، مانند کارت SD، به‌عنوان بخشی از حافظه خارجی در سیستم فایل ظاهر می‌شوند. Android این دستگاه‌ها را بااستفاده از مسیری مثل /sdcard نشان می‌دهد.

برنامه‌ها به‌طور پیش‌فرض در فضای ذخیره‌سازی داخلی ذخیره می‌شوند. بااین‌حال، اگر اندازه APK شما بسیار بزرگ است، می‌توانید در فایل مانیفست برنامه‌تان اولویتی را برای نصب برنامه‌تان در فضای ذخیره‌سازی خارجی نشان دهید:

<manifest ...
  android:installLocation="preferExternal">
  ...
</manifest>

اجازه‌ها و دسترسی به فضای ذخیره‌سازی خارجی

Android اجازه‌های مرتبط با فضای ذخیره‌سازی زیر را تعریف می‌کند: READ_EXTERNAL_STORAGE، WRITE_EXTERNAL_STORAGE، و MANAGE_EXTERNAL_STORAGE.

در نسخه‌های قبلی Android، برنامه‌ها برای دسترسی به هر فایلی خارج از دایرکتوری‌های مختص برنامه در فضای ذخیره‌سازی خارجی باید اجازه READ_EXTERNAL_STORAGE را اعلام می‌کردند. همچنین، برنامه‌ها باید اجازه WRITE_EXTERNAL_STORAGE را برای نوشتن در هر فایلی خارج از دایرکتوری مختص برنامه اعلام می‌کردند.

نسخه‌های جدیدتر Android برای تعیین توانایی برنامه در دسترسی به فایل خاص و نوشتن در آن، بیشتر به هدف فایل متکی هستند تا مکان آن. به‌ویژه، اگر برنامه شما Android 11 (سطح میانای برنامه‌سازی کاربردی ۳۰) یا بالاتر را هدف قرار می‌دهد، اجازه WRITE_EXTERNAL_STORAGE هیچ تأثیری بر دسترسی برنامه‌تان به فضای ذخیره‌سازی ندارد. این مدل فضای ذخیره‌سازی هدف‌محور حریم خصوصی کاربر را بهبود می‌بخشد زیرا برنامه‌ها فقط به بخش‌هایی از سیستم فایل دستگاه دسترسی پیدا می‌کنند که واقعاً از آن‌ها استفاده می‌کنند.

Android 11 اجازه MANAGE_EXTERNAL_STORAGE را معرفی می‌کند که دسترسی نوشتن به فایل‌های خارج از فهرست راهنمای مختص برنامه و MediaStore را فراهم می‌کند. برای کسب اطلاعات بیشتر درباره این اجازه و اینکه چرا اکثر برنامه‌ها برای برآورده کردن موارد استفاده‌شان نیازی به اعلام آن ندارند، راهنمای نحوه مدیریت همه فایل‌ها در دستگاه ذخیره‌سازی را ببینید.

فضای ذخیره‌سازی محدودشده

برای اینکه کاربران کنترل بیشتری بر فایل‌هایشان داشته باشند و به‌هم‌ریختگی فایل‌ها محدود شود، برنامه‌هایی که Android 10 (سطح API ‏۲۹) و بالاتر را هدف قرار می‌دهند، به‌طور پیش‌فرض دسترسی هدف‌دار به فضای ذخیره‌سازی خارجی یا فضای ذخیره‌سازی هدف‌دار دریافت می‌کنند. این برنامه‌ها فقط به دایرکتوری مختص برنامه در فضای ذخیره‌سازی خارجی و همچنین انواع خاصی از رسانه‌ها که برنامه ایجاد کرده است دسترسی دارند.

از فضای ذخیره‌سازی محدودشده استفاده کنید، مگراینکه برنامه‌تان نیاز داشته باشد به فایلی دسترسی پیدا کند که خارج از دایرکتوری مختص برنامه و خارج از دایرکتوری‌ای ذخیره شده است که میاناهای برنامه‌سازی کاربردی MediaStore می‌توانند به آن دسترسی داشته باشند. اگر فایل‌های مختص برنامه را در فضای ذخیره‌سازی خارجی ذخیره می‌کنید، می‌توانید با قرار دادن این فایل‌ها در دایرکتوری مختص برنامه در فضای ذخیره‌سازی خارجی، استفاده از فضای ذخیره‌سازی هدف‌دار را آسان‌تر کنید. به این ترتیب، وقتی فضای ذخیره‌سازی محدودشده فعال باشد، برنامه‌تان دسترسی به این فایل‌ها را حفظ می‌کند.

برای آماده کردن برنامه‌تان برای فضای ذخیره‌سازی محدود، راهنمای روال‌های مطلوب و موارد استفاده از فضای ذخیره‌سازی را مشاهده کنید. اگر برنامه‌تان مورد استفاده دیگری دارد که تحت پوشش فضای ذخیره‌سازی محدودشده نیست، درخواست ویژگی ثبت کنید. می‌توانید به‌طور موقت از استفاده از فضای ذخیره‌سازی محدود انصراف دهید.

مشاهده فایل‌ها در دستگاه

برای مشاهده فایل‌های ذخیره‌شده در دستگاه، از جستجوگر فایل دستگاه در «استودیو Android» استفاده کنید.

منابع بیشتر

برای اطلاعات بیشتر درباره ذخیره‌سازی داده، به منابع زیر مراجعه کنید.

ویدیوها