در قسمت چهلم آموزش اندروید در ادامه آموزش قبل در رابطه با مبحث مهم ذخیره اطلاعات و نحوه ذخیره سازی آموزش داده شده که این بخش شامل ذخیره سازی داخلی و مختصری از ذخیره سازی خارجی میباشد.
ذخیره سازی در حافظه داخلی زمانی استفاده میشود که نیاز به ذخیره خصوصی یا private اطلاعات داریم بدین معنی که اطلاعات در حافظه داخلی دستگاه ایجاد و تنها توسط خود برنامه قابل دسترسی باشند و با حذف برنامه نیز پاک شوند.
برای درج اطلاعات باید متد openFileOutput فراخوانی شود که شامل دو پارامتر ورودی میباشد یکی نام فایل و دیگری MODE که میتوان PRIVATE , PUBLIC و… باشد این کار باعث ایجاد یک شی از نوع FileOutputStream میشود که میتوان از طریق این شی متد write() را فراخوانی کرده و اطلاعات را در حافظه درج کرد.
همچنین برای خواندن اطلاعات از حافظه داخلی ابتدا باید یک شی از نوع FileInputStream که با استفاده از متد openFileInput() ایجاد میشود و سپس با استفاده متدی مثل read() یکی یکی کاراکتر هارا خوانده و نمایش میدهد.
با مثال زیر این روش را بهتر درک خواهید کرد پس یک پروژه جدید بنام InternalStorage ایجاد کرده و در فایل activity_main.xml ابزار های زیر را ایجاد میکنیم
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.internalstorage.MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Enter the Text" /> <EditText android:id="@+id/edt1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView1" android:layout_below="@+id/textView1" android:layout_marginTop="14dp" android:ems="10" > <requestFocus /> </EditText> <Button android:id="@+id/btnsave" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/edt1" android:layout_below="@+id/edt1" android:layout_marginLeft="45dp" android:layout_marginTop="22dp" android:text="Save" /> <TextView android:id="@+id/tv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/edt1" android:layout_centerHorizontal="true" /> <Button android:id="@+id/btnload" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/btnsave" android:layout_alignBottom="@+id/btnsave" android:layout_toRightOf="@+id/tv2" android:text="Load" /> </RelativeLayout>
تمام این ابزارها را بصورت گرافیکی ایجاد کرده و زحمت کدنویسی رو به خودتون ندید!
حال در فایل جاوای برنامه MainActivity.java دستورات زیر را مینویسیم
package com.example.internalstorage; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { Button btnsave; Button btnload; EditText edt; TextView tv; String data; private String file="mydata"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edt=(EditText)findViewById(R.id.edt1); tv=(TextView)findViewById(R.id.tv2); btnsave=(Button)findViewById(R.id.btnsave); btnload=(Button)findViewById(R.id.btnload); btnsave.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub data=edt.getText().toString(); try { FileOutputStream fout= openFileOutput(file, MODE_WORLD_READABLE); fout.write(data.getBytes()); fout.close(); edt.setText(""); Toast.makeText(MainActivity.this, "file has been saved", Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } } }); btnload.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { try{ FileInputStream fin=openFileInput(file); int c; String temp=""; while((c=fin.read()) != -1 ){ temp += Character.toString((char)c); } tv.setText(temp); Toast.makeText(MainActivity.this, "file has been read", Toast.LENGTH_SHORT).show(); }catch(Exception e){ } } }); } } }
حال برنامه را اجرا کرده و متنی را در EditText بنویسید سپس دکمه Save را کلیک کنید خواهید دید متن پاک شده و پیغام تایید نیز نمایش داده میشود سپس دکمه load را کلیک کنید و خواهید دید متن سیو شده در TextView نمایش داده میشود
در فایل جاوا برنامه تا قسمت تعریف عملکرد دکمه save اقدام به تعریف اشیا و متغیرهای مختلف که در ادامه برنامه استفاده میشوند کرده ایم حال به دستوراتی که برای دکمه save نوشته شده توجه کنید
btnsave.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub data=edt.getText().toString(); try { FileOutputStream fout=openFileOutput(file, MODE_PRIVATE); fout.write(data.getBytes()); fout.close(); edt.setText(""); Toast.makeText(MainActivity.this, "file has been saved", Toast.LENGTH_SHORT).show(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } });
در این بخش ابتدا مقدار درون EditText را درون متغیری به نام data قرار میدهیم سپس با استفاده از FileOutputStream و متد openFileOutput که در ابتدای آموزش توضیح داده شد اقدام به ذخیره مقدار میکنیم و نام فایل را متغیر file که در ابتدای کدنویسی مقداری دلخواه برایش تعریف شده قرار میدهیم و MODE مورد نظر را نیز قرار میدهیم سپس از شی ایجاد شده استفاده میکنیم و متد write را فراخوانی میکنیم و در انتها نیز Close . فرایند ذخیره سازی با همین سه خط کد به اتمام میرسد پس در ادامه میتوان EditText را خالی و پیغام مناسب را نمایش داد.توجه کنید که این دستورات را درون بلاک try و catch قرار دادیم تا در صورت بروز خطا اقدام مناسب را انجام دهد.
حال به دستورات درون دکمه load دقت کنید
btnload.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { try{ FileInputStream fin=openFileInput(file); int c; String temp=""; while((c=fin.read()) != -1 ){ temp += Character.toString((char)c); } tv.setText(temp); Toast.makeText(MainActivity.this, "file has been read", Toast.LENGTH_SHORT).show(); }catch(Exception e){ } } });
در این بخش نیز از بلاک try و catch استفاده کردیم و درون آن از FileInputStream و متد openFileInput استفاده کرده و تنها نام فایل را به عنوان آرگومان میدهیم سپس با استفاده از یک حلقه for یکی یکی کاراکترها را دریافت کرده و در انتها درون TextView قرار میدهیم.
اگر به قسمت DDMS رفته زبانه fileExplorer را انتخاب کنید و به مسیر مربوطه بروید خواهید دید یک فایل با همان نام file که انتخاب کرده اید ایجاد شده
در بخش قبل نحوه استفاده از حافظه داخلی را آموختیم اما در بعضی مواقع ممکن است که بخواهیم اطلاعاتی را بخاطر حجم زیاد و یا نیاز به , به اشتراک گذاشتن , درون حافظه خارجی دستگاه یا SDCard ذخیره کنیم.
از نکات اصلی ذخیره سازی در حافظه خارجی میتوان به دستورات زیر اشاره کرد
ابتدا از متدgetExternalStorageDirectory() برای دریافت مسیر قرار گیری حافظه خارجی استفاده میکنیم که معمولا این حافظه در یک دستگاه واقعی در مسیر /sdcard و در یک شبیه ساز در مسیر mnt/sdcard قرار دارد اما استفاده از مسیر یکسان کار درستی نیست زیرا که ممکن است هرسازنده دستگاه مسیر مشخص خود را داشته باشد.
سپس در کارت حافظه با استفاده از متد getAbsolutePath فولدری بنام دلخواه ایجاد کرده و سپس اطلاعات خود را وارد میکنیم.