4 نوع حافظه در اندروید مخصوص برنامه نویسی

امروز همه ما با مفهوم ذخیره سازی انواع داده ها آشنا هستیم. البته آشنایی ما در این چند سال آخر حالت پیچیده تری پیدا کرده و گوشی های موبایل امروزه ظرفیت ذخیره سازی چند ترابایتی دارند. قبل از این که گوشی های هوشمند همه گیر بشوند، ما معمولا روی گوشی موبایل خودمان چند تا عکس و شماره تلفن و تعداد خیلی زیادی پیام متنی نگه داری میکردیم. اما با گوشی های موبایل هوشمند فایل های عکس، موزیک، کلیپ و فیلم های طولانی، برنامه های مختلف و فایل های دیگر را روی این گوشی ها ذخیره میکنیم. حافظه گوشی های موبایل هم دقیقا به همین نسبت تغییر کرده اند و در این مقاله از بلاگ برنامه چی میخواهیم درباره 4 مدل حافظه در اندروید که به عنوان یک برنامه نویس میتوانید برای اپلیکیشن خودتان از آنها استفاده کنید را بررسی کنیم.

انواع حافظه در اندروید

بصورت خلاصه میتوان گفت که چهار مدل حافظه اندروید برای ذخیره داده های اپلیکیشن وجود دارند: Shared Preferences، Internal Storage، External Storage و دیتابیس SQLite. مواردی که در این نوشته بررسی میشوند عبارتند از: انواع مختلف حافظه در اندروید، تفاوت این حافظه ها و نحوه استفاده از هر کدام آنها. فهرست تیتر ها را میتوانید در باکس زیر مشاهده کنید.


ویدئو: انواع حافظه ها در اندروید


انواع حافظه در اندروید

به طور کلی هر اپلیکیشن به دو نوع حافظه در اندروید دسترسی دارد: حافظه داخلی (Internal Storage)، حافظه خارجی (External Storage). تفاوت های عمده ای بین این دو مدل فضای ذخیره سازی وجود دارد و آشنایی با هرکدام از این مدل ها، به شما برای طراحی اپلیکیشن های خودتان کمک خواهد کرد.

قبل از اینکه بحث درباره فضاهای ذخیره سازی را شروع کنیم، باید فرق بین Storage و Cache را بدانید. از Storage برای ذخیره دائمی داده های اپلیکیشن استفاده میشود اما دیتایی که به عنوان Cache ذخیره شده باشد عمر کوتاهی دارد و دائمی نیست.

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

حافظه در اندروید storage

چند مدل حافظه در اندروید برای اپلیکیشن ها وجود دارد:

  1. Shared Preferences: برای ذخیره سازی داده های اولیه خصوصی با فرمت Key-Value
  2. حافظه داخلی (Internal Storage): برای ذخیره داده های خصوصی روی حافظه داخلی دستگاه
  3. حافظه خارجی (External Storage): برای ذخیره داده های عمومی روی حافظه خارجی اشتراکی
  4. دیتابیس (SQLite Database): برای ذخیره داده های خصوصی با ساختار خاص

علاوه بر اینها، در سیستم عامل اندروید میتوانید داده های خصوصی خودتان را با استفاده از Content Provider ها در اختیار اپلیکیشن های دیگر قرار بدهید. Content Provider ها یکی از کامپوننت های اپلیکیشن هستند که میتوانند اجازه خواندن و نوشتن برای داده های اپلیکیشن را صادر کنند. البته استفاده از این کامپوننت کاملا اختیاری است و میتوانید محدودیت هایی که میخواهید را به آن اعمال کنید.

نکته دیگه ای که باید بدانید این است که مفهوم حافظه داخلی و حافظه خارجی که در ادامه نوشته میخواهیم آنها را تعریف کنیم، با حافظه داخلی گوشی و حافظه خارجی گوشی (یا همون SD Card) که از قبل میشناختید فرق دارند. فضاهای داخلی و خارجی ذخیره سازی که برای برنامه نویس ها در دسترس هستند نسبت به اپلیکیشن در نظر گرفته میشوند. برای آشنایی بهتر با این مفهوم ها، قسمت های بعدی در همین نوشته را مطالعه کنید.


حافظه داخلی (Internal Storage)

یکی از انواع حافظه در اندروید حافظه داخلی است. هر اپلیکیشنی که روی سیستم عامل اندروید اجرا میشود، یک حافظه داخلی اختصاصی برای خودش دارد. این حافظه کاملا خصوصی است و برای استفاده اپلیکیشن است. یعنی بقیه اپلیکیشن ها و حتی کاربر (البته اگر Root نباشد) به آن دسترسی ندارند. پس Internal Storage یک محل خوب برای ذخیر داده هایی است که کاربر نیاز ندارد بصورت مستقیم آنها را دستکاری یا مشاهده کند. نکته مهم دیگر در دسترس بودن این حافظه است. حافظه داخلی بر خلاف حافظه خارجی همیشه در دسترس اپلیکیشن است.

حافظه داخلی در اندروید

اما استفاده از حافظه داخلی برای ذخیره کردن داده ها، اشکالاتی هم دارد. اگر کاربر اپلیکیشن را حذف کند، همه داده هایی که روی حافظه داخلی اپلیکیشن ذخیره شده اند نیز از دست میروند. بنابراین شما نباید از Internal Storage برای ذخیره کردن داده هایی که کاربر انتظار دارد همیشه وجود داشته باشند استفاده کنید. مثلا فرض کنید کاربر یک بازی که شما تولید کرده اید را نصب میکند و همه اطلاعات روی حافظه داخلی ذخیره میشوند. ممکن است کاربر بخواهد این بازی را حذف کند، همه مراحلی که طی کرده از دست میرود و اطلاعات پاک خواهند شد. یعنی اگر کاربر دفعه بعدی بازی را دوباره نصب کند، باید از اول شروع کند.

اما چجوری باید داده ها را روی حافظه داخلی اپلیکیشن ذخیره کنیم؟


نوشتن فایل روی Internal Storage

وقتی که میخواهید یک فایل را روی Internal Storage ذخیره کنید، میتوانید دایرکتوری فایل های سیستم را در قالب یک آبجکت از کلاس File دریافت کنید. برای این کار باید یکی از متد های زیر را به کار ببرید:

  1. متد getFilesDir: وقتی این متد را صدا میزنید یک آبجکت از کلاس File برمیگردد که شامل لیست فایل های موجود در حافظه داخلی اپلیکیشن شماست.
  2. متد getCacheDir: این متد یک آبجکت از کلاس File برمیگرداند که شامل لیست فایل های کش شده (موقتی) اپلیکیشن شماست. در کار کردن با این حافظه باید یادتان باشد که هر وقت دیگر به فایلی نیاز نداشتید، باید آن را حذف کنید. همچنین میزان استفاده از آن را به یک عدد کوچک مثلا 1 مگابایت محدود کنید.

هشدار: اگر دستگاه موبایل حافظه کمی داشته باشد، سیستم عامل اندروید بصورت اتوماتیک همه فایل های موجود در Cache را بدون هیچ هشداری حذف خواهد کرد.

برای اینکه فایل جدیدی را روی این نوع حافظه در اندروید ایجاد کنید، باید از متد سازنده کلاس File استفاده کنید و یک آبجکت از کلاس File را به آن پاس بدهید. همان آبجکتی که از متد های بالا به دست می آید. مثال زیر را مشاهده کنید:

File file = new File(context.getFilesDir(), filename);

راه دوم این است که از متدopenFileOutput استفاده کنیم تا یک آبجکت از کلاسFileOutputStream به ما برگردانده شود. این کلاس میتواند یک فایل را بصورت مستقیم روی حافظه داخلی بنویسد. برای نوشتن داده ها باید از متد write و برای بستن جریان داده باید از متدclose استفاده کنیم. مثال زیر را مشاهده کنید، این کدها میتوانند مقداری متن را درون یک فایل بریزند.

String filename = "myfile";
String fileContents = "Hello world!";
FileOutputStream outputStream;
try {
outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
outputStream.write(fileContents.getBytes());
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}

استفاده از MODE_PRIVATE باعث میشود فایل ها بصورت اختصاصی برای اپلیکیشن تولید بشوند (اگر هم از قبل وجود داشته باشن جایگزین میشن).


فایل های Cache داخلی

فایل cache حافظه در اندروید

اگر میخواهید تعدادی از داده های خودتان را به صورت موقتی روی یک حافظه در اندروید ذخیره کنید و نیازی نیست که این داده ها بصورت دائم در حافطه باقی بمانند، میتوانید از دایرکتوری مخصوص فایل های کش استفاده کنید. هر اپلیکیشن در سیستم عامل اندروید دارای یک دایرکتوری خصوصی برای فایل های Cache است. همانطور که قبل تر هم گفتیم، وقتی سیستم عامل اندروید دچار کمبود حافظه باشد ممکن است همه این فایل های کش بدون اخطار قبلی حذف بشوند. اما شما نباید برای پاکسازی این فایل ها منتظر سیستم عامل بمانید.

یعنی به عنوان یک برنامه نویس، وظیفه شما این است که همیشه فایل های کش را پاکسازی کنید و مقدار این فایل ها را محدود نگه دارید. این فایل ها هم با Uninstall کردن اپلیکیشن، پاک میشوند.


نوشتن یک فایل Cache

اگر میخواهید یک فایل Cache بسازید، میتوانید از متد createTempFile که در کلاس File وجود دارد استفاده کنید. مثال زیر را ببینید. در این کدها، نام فایل را از یک مسیر URL استخراج میکنیم و یک فایل به همین اسم در دایرکتوری کش داخلی اپلیکیشن میسازیم.

private File getTempFile(Context context, String url) {
File file;
try {
String fileName = Uri.parse(url).getLastPathSegment();
file = File.createTempFile(fileName, null, context.getCacheDir());
} catch (IOException e) {
// Error while creating file
}
return file;
}

متدهای مفید برای کار با حافظه داخلی

تعدادی از متدهای مفید برای کار با فایل هایی روی حافظه داخلی قرار دارند در ادامه معرفی شده اند:

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

حافظه خارجی (External Storage)

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

حافظه خارجی

فایل هایی که روی این حافظه در اندروید وجود دارند، برای همه اپلیکیشن ها و کاربر قابل مشاهده و دستکاری هستند (به اصطلاح به آنها World-Readable میگوییم). به همین دلیل، قبل از اینکه بخواهید داده ای را روی این حافظه ذخیره کنید یا از روی آن بخوانید باید از در دسترس بودن External Storage و فایل هایی که نیاز دارید، مطمئن شوید.

معمولا از حافظه خارجی برای داده هایی استفاده میشود که باید در اختیار اپلیکیشن های دیگر قرار بگیرد و حتی بعد از Uninstall اپلیکیشن هم روی دستگاه باقی بمانند، مانند عکس های گرفته شده با دوربین یا فایل های دانلود شده. سیستم عامل اندروید بصورت پیشفرض دایرکتوری های مشخصی برای اکثر این جور فایل ها دارد. یعنی میتوانید از دایرکتوری ها یا همان فولدر های Photo، Music، Videos و غیره استفاده کنید.

دوباره به حافظه داخلی و خارجی دقت کنید. همانطور که قبل تر هم گفتم، این حافظه ها با حافظه داخلی و خارجی که در تبلیغات گوشی یا در مشخصات آن خوانده اید فرق میکنند. یعنی وقتی در مشخصات سخت افزاری گوشی شما نوشته شده مثلا 128 گیگابایت حافظه داخلی، همه این حافظه به عنوان حافظه داخلی در اختیار اپلیکیشن قرار نمیگیرد.

برنامه نویس های اندروید باید اینطور فکر کنند: هر اپلیکیشن در سیستم عامل اندروید، یک فضای خصوصی برای خودش دارد که این فضا در اختیار هیچکس دیگر نیست. حتی کاربر در File Manager خودش هم نمیتواند این فضا را مشاهده کند. برای متوجه شدن این موضوع میتوانید همین الان به تنظیمات گوشی خودتان مراجعه کنید. اگر مثلا حافظه داخلی سخت افزاری گوشی شما 128 گیگ باشد، در تنظیمات میبینید که حدود 117 گیگابایت آن در اختیار شما قرار دارد و 10 گیگابایت را خود سیستم اشغال کرده است. این دقیقا فضایی است که برای اپلیکیشن ها در نظر گرفته شده است.

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


ذخیره فایل روی External Storage

ذخیره فایل ها روی حافظه خارجی یکی از بهترین راه ها برای اشتراک داده ها با اپلیکیشن های دیگر یا حتی با کاربر است. وقتی این کار را بکنید کاربر میتواند این داده ها را به دستگاه های دیگر منتقل کند و بقیه اپلیکیشن ها هم میتوانند آن را دستکاری کنند. اولین کاری که باید برای ذخیره فایل روی حافظه خارجی انجام بدهید، این است که Storage Permission را دریافت کنید. بعد از آن باید مطمئن شوید که حافظه خارجی در دسترس است. بعد از این کار ها میتوانید دو مدل از فایل ها را ذخیره کنید:

  • فایل های Public: فایل هایی که باید بصورت آزادانه برای اپلیکیشن ها و کاربر در دسترس باشند. وقتی هم که کاربر نرم افزار را Uninstall میکند، این فایل ها باید روی دستگاه باقی بمانند. برای مثال، عکس هایی که با دوربین گوشی گرفته شده یا فایل هایی که دانلود شده اند در این دسته قرار میگیرند.
  • فایل های Private: فایل هایی که مخصوص اپلیکیشن شما هستند و بعد از Uninstall شدن، باید حذف بشوند. هرچند این فایل ها به دلیل قرار گرفتن روی حافظه خارجی در اختیار دیگر اپلیکیشن ها و کاربر قرار دارند، اما ارزشی برای آنها ندارد. مثلا دیتای بازی های مختلف از این مدل فایل ها هستند.
حافظه خارجی

هشدار: همانطور که قبل تر هم گفتیم، حافظه خارجی ممکن است توسط کاربر از دستگاه خارج شود یا از دسترس اپلیکیشن خارج بشود. همچنین این فایل ها برای کاربر و همه اپلیکیشن هایی که مجوز READ_EXTERNAL_STORAGE دارند قابل مشاهده هستند. اگر فایل هایی که میخواهید روی این حافظه در اندروید بریزید بسیار حیاتی هستند و اپلیکیشن بدون آنها کار نمیکند، بهتر است از حافظه داخلی استفاده کنید.


دریافت Permission های حافظه خارجی

برای اینکه بخواهیم داده ای را روی حافظه خارجی بریزیم، باید مجوز WRITE_EXTERNAL_STORAGE را در فایل Manifest پروژه خودمان اضافه کنیم. مثال زیر را مشاهده کنید:

<manifest …>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
…
</manifest>

نکته: اگر مجوز WRITE_EXTERNAL_STORAGE را در اپلیکیشن خود تعریف کنید، بصورت غیر مستقیم مجوز READ یا خواندن حافظه خارجی را هم گرفته اید.

اگر اپلیکیشن شما فقط نیاز به خواندن External Storage دارد، نیاز دارید مجوز READ_EXTERNAL_STORAGE را در فایل Manifest تعریف کنید. کد های زیر نحوه انجام این کار را نشان میدهند.

<manifest …>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
…
</manifest>

بررسی در دسترس بودن حافظه خارجی

همانطور که میدانید External Storage ممکن است توسط کاربر از دستگاه خارج شود یا در دسترس اپلیکیشن نباشد. به همین دلیل باید قبل از هر کاری، وجود حافظه خارجی را بررسی و تایید کنیم. برای دریافت وضعیت External Storage میتوانیم از متد getExternalStorageState استفاده کنیم. اگر مقدار برگشتی برابر با MEDIA_MOUNTED بود، میتوانید عملیات خواندن و نوشتن روی حافظه خارجی را انجام بدهید. اگر مقدار برگشتی MEDIA_MOUNTED_READ_ONLY بود فقط میتوانید داده ها را بخوانید.

برای مثال در کدهای زیر، متد های به درد بخور برای بررسی وضعیت External Storage را میتوانید مشاهده کنید.

/* Checks if external storage is available for read and write <em>/
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/</em> Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}

ذخیره فایل در دایرکتوری Public

اگر میخواهید فایل های Public را روی حافظه خارجی ذخیره کنید، میتوانید از متد getExternalStoragePublicDirectory استفاده کنید که یک آبجکت از کلاس File شامل دایرکتوری مناسب فایل های Public به شما برمیگرداند. این متد یک پارامتر ورودی دریافت میکند که با استفاده از آن مشخص میکند کدام مسیر را برای فایل های شما انتخاب کند. مقادیری مانند DIRECTORY_MUSIC و DIRECTORY_PICTURES را میتوانید به آن پاس بدهید. کدهای زیر را مشاهده کنید:

public File getPublicAlbumStorageDir(String albumName) {
// Get the directory for the user's public pictures directory.
File file = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
return file;
}

استفاده از Shared Preferences

یکی از انواع حافظه در اندروید که کار کردن با آن بسیار ساده است، SharedPreferences نام دارد. اگر داده هایی که میخواهید ذخیره کنید کم هستند و نیاز به ساختار خاصی ندارند، میتوانید از SharedPreferences استفاده کنید. کلاس SharedPreferences یک چارچوب برای ذخیره کردن و خواندن داده های اولیه به شکل Key-Value است. یعنی از این کلاس میتوانیم برای این نوع داده ها استفاده کنیم: boolean، int، float، long، string و…

sharedpreferences حافظه در اندروید

داده هایی که با ShredPreferences ذخیره میشوند تا زمانی که داده های اپلیکیشن پاک نشده باشد، وجود خواهند داشت. حتی اگر اپلیکیشن را به صورت کامل ببندیم. برای ساخت آبجکت SharedPreferences میتوانیم یکی از متد های زیر را به کار ببریم:

  1. متد getSharedPreferences: اگر میخواهید چند فایل Preferences برای شما ایجاد شود که اسم های متفاوتی دارند، میتوانید از این متد استفاده کنید.
  2. متد getPreferences: این متد برای دریافت یک Preferences تکی، در اکتیویتی به کار برده میشود. آبجکتی که از این طریق دریافت میشود فقط برای اکتیویتی به کار برده میشود.

نوشتن داده روی SharedPreferences

برای این کار باید ابتدا یک آبجکت از کلاس SharedPreferences.Editor بسازیم. یک متد در کلاس SharedPreferences وجود دارد به نام edit که این آبجکت را به ما میدهد. پس فقط نیاز داریم این متد را صدا بزنیم. بعد از این مرحله باید داده هایی که میخواهیم ذخیره بشوند را با متد هایی مانند putInt و putString و غیره که در این کلاس وجود دارند، درون SharedPreferences بریزیم. به عنوان آخرین مرحله هم باید متد apply یا متد commit را صدا بزنیم تا عملیات ویرایش تمام شده و داده ها ثبت شوند. کد های زیر را مشاهده کنید:

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score_key), newHighScore);
editor.commit();return file;
}

تفاوت متد apply و  متد commit این است که در متد apply تغییرات بصورت غیر همزمان (Async) روی حافظه ریخته میشوند اما متد commit همه داده ها را بصورت همزمان (Sync) روی حافظه ذخیره میکند. بنابراین نباید روی Thread اصلی اپلیکیشن خودتان، از متد commit استفاده کنید. زیرا ممکن است باعث فریز شدن یا بلاک شدن رابط کاربری شما بشود.


خواندن داده از روی SharedPreferences

برای خواندن داده ها از روی sharedPreferences باید از متد هایی مانند getInt یا getString و غیره که در این کلاس وجود دارند استفاده کنیم. به عنوان پارامتر ورودی به این متد ها باید مقدار Key که برای ذخیره کردن داده استفاده کردیم را پاس بدهیم، متد هم مقدار Value را به ما برمیگرداند. این متد ها یک پارامتر ورودی دیگر به اسم Default دریافت میکنند که اجباری نیست و میتوانید آن را وارد نکنید. اما اگر تحت هر شرایطی خواندن داده ها از روی SharedPreferences موفق نبود (یعنی مثلا مقدار مناسب برای Key ما وجود نداشت)، مقدار Default توسط متد برگردانده میشود. در مثال زیر میتوانید نحوه خواندن داده از روی SharedPreferences را مشاهده کنید:

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.integer.saved_high_score_default_key);
int highScore = sharedPref.getInt(getString(R.string.saved_high_score_key), defaultValue)

استفاده از پایگاه داده (Database)

شما میتوانید داده های خودتان را بصورت ساختارمند روی حافظه در اندروید ذخیره کنید. سیستم عامل اندروید بصورت کامل از پایگاه داده SQLite پشتیبانی میکند. دقت کنید هر پایگاه داده ای که برای اپلیکیشن خودتان میسازید، فقط برای همان اپلیکیشن در دسترس است. اما به جای استفاده مستتقیم از API های موجود برای SQLite، پیشنهاد میکنم برای ساخت و تعامل با پایگاه داده اپلیکیشن خودتان، حتما از کتابخانه Room استفاده کنید.

دیتابیس حافظه در اندروید

البته شما خودتان میتوانید بصورت مستقیم از API های پایگاه داده SQLite استفاده کنید، اما این API ها تقریبا سطح پایین هستند و نیاز به تلاش و زمان زیادی برای پیاده سازی درست دارند. کتابخانه Room با اضافه کردن یک لایه انتزاعی روی SQLite، ساختن و تعامل با این پایگاه داده را بسیار راحت تر و پایدار تر میکند.


نکاتی درباره محل نصب اپلیکیشن

در این مقاله درباره نحوه استفاده از فضاهای مختلف و انواع مختلف حافظه در اندروید برای ذخیره کردن داده های اپلیکیشن صحبت کردیم. اما بنظرم باید نحوه رفتار اپلیکیشن در زمان نصب شدن را هم بررسی کنیم. بصورت پیشفرض همه اپلیکیشن ها در حافظه داخلی نصب میشوند. اما از API 8 به بعد سیستم عامل اندروید، شما میتوانید ویژگی installLocation را به فایل Manifest پروژه خودتان اضافه کنید. این ویژگی به اپلیکیشن شما اجازه میدهد روی حافظه خارجی نصب شود. دلیل وجود این ویژگی برای اپلیکیشن هایی است که حجم بالایی دارند و بهتر است روی حافظه خارجی نصب شوند.

محل نصب اپلیکیشن در اندروید

سه مقدار مختلف برای این Attribute میتوانیم مشخص کنیم:

  • auto: یعنی شما نظر خاصی برای محل نصب اپلیکیشن ندارید. در این سناریو عمل نصب کردن اول روی حافظه داخلی انجام میشود و اگر فضای کافی وجود نداشت، اپلیکیشن روی حافظه خارجی نصب خواهد شد.
  • internalOnly: اپلیکیشن فقط روی حافظه داخلی نصب میشود و اگر فضای کافی وجود نداشت، عملیات نصب کنسل میشود.
  • preferExternal: وقتی از این مقدار استفاده کنید اپلیکیشن سعی میکند روی حافظه خارجی نصب شود. اما اگر فضای کافی وجود نداشته باشد، روی حافظه داخلی نصب میشود.

{باکس: برای هر دو گزینه auto و preferExternal کاربر میتواند اپلیکیشن را از حافظه داخلی به حافظه خارجی و برعکس انتقال بدهد.

این نکته را هم فراموش نکنید زمانی که کاربر حافظه خارجی را از دستگاه خارج کند یا از دسترس اپلیکیشن خارج نماید (مثل وقتی که با کابل گوشی رو به کامپیوتر وصل میکنین و Data Sharing رو فعال میکنین)، همه اپلیکیشن هایی که روی حافظه خارجی قرار دارند از بین میروند (البته بعد از برگردوندن حافظه همه چیز درست میشه). اگر اپلیکیشن شما یکی از ویژگی های زیر را دارد، نباید آن را روی حافظه خارجی نصب کنید:

  • سرویس های مختلف (مخصوصا سرویس های آلارم دهنده)
  • Input Method Engines
  • پس زمینه های زنده (Live Wallpapers)
  • ویجت اپلیکیشن ها
  • Account Managers
  • Sync Adapters
  • Device Administrators
  • و BroadCast Receiver هایی که به تمام شدن Boot گوش میدهند

منابع بیشتر برای مطالعه

میتوانید از منابع زیر برای مطالعه بیشتر درباره روش های ذخیره سازی داده ها و انواع حافظه در اندروید استفاده کنید:

درباره نویسنده

1 در مورد “4 نوع حافظه در اندروید مخصوص برنامه نویسی”

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

اسکرول به بالا