سبد (0)

ذخیره و بازیابی تنظیمات کاربر

در این آموزش یاد میگیرید که چگونه اطلاعات را در برنامه اندروید ذخیره کنید.ذخیره ی اطلاعات در برنامه نویسی و توسعه ی برنامه ها اهمیت زیادی دارد.چون که همیشه کاربران با اطلاعاتی سروکار دارند که بعداً به آن ها احتیاج پیدا می کنند.در اندروید سه راه برای ذخیره ی اطلاعات وجود دارد:

  • یک راه ساده و سبک به نام shared perferences برای ذخیره سازی ساده اطلاعات
  • سیستم فایل سنتی
  • یک سیستم مدیریت داده رابطه ای با نام بانک اطلاعاتی SQLite

روش های ارائه شده در این آموزش به برنامه شما قابلیت ذخیره اطلاعات به صورت خصوصی را می دهد.

ذخیره و بازیابی تنظیمات کاربر

اندروید شئ SharedPreferences را برای کمک به ذخیره سازی ساده ی داده ها فراهم کرده است.به عنوان مثال برنامه شما ممکن است قابلیت تنظیم اندازه فونت توسط کاربر را داشته باشد.بنابراین برنامه شما نیاز دارد که بتواند اندازه ای را که کاربر تنظیم کرده است را ذخیره کرده و در اجرای بعدی طبق سلیقه ی کاربر نمایش دهد.برای انجام این کار روش های متفاوتی وجود دارد.می توانید اطلاعات را در یک فایل ذخیره کنید,اما شما مسئله ی مدیریت فایل را خواهید شد.حال اگر تعداد این تنظیمات زیاد باشد مثلاً اندازه فونت, نام فونت, رنگ پس زمینه و ... آنگاه کار با فایل ها برای ذخیره سازی کاری طاقت فرسا خواهد بود.

یک راه دیگر برای این کار استفاده از بانک اطلاعاتی است اما استفاده از بانک اطلاعاتی نیاز به برنامه نویسی منسجمی دارد.هر دو روش را کاربران و توسعه دهندگان استفاده می کنند.

با استفاده از شئ SharedPreferences می توانید اطلاعات خود را از روش کلید / مقدار ذخیره کنید.یعنی برای اطلاعات مورد خود نامی در نظر گرفته و سپس مقداری را به آن نسبت می دهیم.هر دو مورد به صورت خودکار در فایل XML ذخیره می گردد.

دسترسی به تنظیمات با استفاده از یک اکتیویتی

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

استفاده از متد ()getSharedPreferences

برای اینکه ببینید شئ SharedPreferences چگونه کار می کند تمرین زیر را که نشان می دهد چگونه اطلاعات کاربر را در یک فایل xml ذخیره کنید و سپس آن را به راحتی از طریق همان شئ بازیابی کنید,انجام دهید .

1.با استفاده از اکلیپس یک پروژه جدید با نام SharedPreferences ایجاد کنید.

2. فایل main.xml را به صورت زیر ویرایش کنید:

 

<?xml version=”1.0” encoding=”utf-8”?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent” >
<SeekBar
android:id=”@+id/SeekBar01”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content” />
<TextView
android:id=”@+id/TextView01”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”@string/hello” />
<EditText
android:id=”@+id/EditText01”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content” />
<Button
android:id=”@+id/btnSave”
android:text=”Save”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content” />
</LinearLayout>

 3.فایل MainActivity.java را به صورت زیر ویرایش کنید:

 

package com.PRG.SharedPreferences;
import android.app.Activity;
import android.os.Bundle;
import android.content.SharedPreferences;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Toast;
public class MainActivity extends Activity {
private SharedPreferences prefs;
private String prefName = “MyPref”;
private EditText editText;
private SeekBar seekBar;
private Button btn;
private static final String FONT_SIZE_KEY = “fontsize”;
private static final String TEXT_VALUE_KEY = “textvalue”;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
editText = (EditText) findViewById(R.id.EditText01);
seekBar = (SeekBar) findViewById(R.id.SeekBar01);
btn = (Button) findViewById(R.id.btnSave);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//---get the SharedPreferences object---
prefs = getSharedPreferences(prefName, MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
//---save the values in the EditText view to preferences---
editor.putFloat(FONT_SIZE_KEY, editText.getTextSize());
editor.putString(TEXT_VALUE_KEY, editText.getText().toString());
//---saves the values---
editor.commit();
//---display file saved message---
Toast.makeText(getBaseContext(),
“Font size saved successfully!”,
Toast.LENGTH_SHORT).show();
}
});
//---load the SharedPreferences object---
SharedPreferences prefs = getSharedPreferences(prefName, MODE_PRIVATE);
//---set the TextView font size to the previously saved values---
float fontSize = prefs.getFloat(FONT_SIZE_KEY, 12);
//---init the SeekBar and EditText---
seekBar.setProgress((int) fontSize);
editText.setText(prefs.getString(TEXT_VALUE_KEY, “”));
editText.setTextSize(seekBar.getProgress());
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
//---change the font size of the EditText---
editText.setTextSize(progress);
}
});
}
}

4.برنامه را در شبیه ساز اجرا کنید.

5.مقداری را در EditText وارد کنید و سپس سایز فونت را به وسیله ی تنظیمات seekBar تغییر دهید.

6.مجدداً به اکلیپس برگردید و دوباره برنامه را در شبیه ساز اجرا کنید.حالا برنامه مقداری را برای سایز فونت به نمایش می گذارد که شما تنظیم کردید.

روش کار

 با استفاده از شئ SharedPreferences از متد ()getSharedPreferences استفاده می کنید و نام فایل Shared Preferences را ارسال می کنید که در آن تمام داده ها ذخیره ی شود و نیز در حالتی که اجرا می شود:

 

private SharedPreferences prefs;
...
//---get the SharedPreferences object---
prefs = getSharedPreferences(prefName, MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();

ثابت MODE_PRIVATE نشان می دهد که فایل Shared Preferences فقط می تواند به وسیله ی برنامه ای که آن را ایجاد کرده باز شود.

کلاس  Editot این قابلیت را به شما می دهد که هر دوی کلید/مقدار را در تنظیمات فایل به وسیله  فراخوانی متدهای زیر ذخیره کنید.

  • ()putString
  • ()putBoolean
  • ()putLong
  • ()putInt
  • ()putFloat

زمانی که شما در حال ذخیره کردن مقادیر هستید, متد ()commit را برای ذخیره ی تغییرات فراخوانی کنید.

 

//---save the values in the EditText view to preferences---
editor.putFloat(FONT_SIZE_KEY, editText.getTextSize());
editor.putString(TEXT_VALUE_KEY, editText.getText().toString());
//---saves the values---
editor.commit();

زمانی که اکتیویتی در حال اجرا است اول شئ SharedPreferences را بدست آورید و سپس همه ی مقادیر که قبلاً ذخیره کردید را بازیابی کنید:

 

//---load the SharedPreferences object---
SharedPreferences prefs = getSharedPreferences(prefName, MODE_PRIVATE);
//---set the TextView font size to the previously saved values---
float fontSize = prefs.getFloat(FONT_SIZE_KEY, 12);
//---init the SeekBar and EditText---
seekBar.setProgress((int) fontSize);
editText.setText(prefs.getString(TEXT_VALUE_KEY, “”));
editText.setTextSize(seekBar.getProgress());

فایل Shared preferences به عنوان فایل XML در مسیر زیر ذخیره شده است:

 


/data/data/<package_name>/shared_prefs فولدر

که محتوان آن در زیر نمایش داده شده است:

 

<?xml version=’1.0’ encoding=’utf-8’ standalone=’yes’ ?>
<map>
<string name=”textvalue”>This is so cool!</string>
<float name=”fontsize” value=”75.0” />
</map>

ذخیره سازی در حافظه ی داخلی

 اولین راه ذخیره سازی فایل ها,نگهداری آنها در حافظه ی داخلی دستگاه می باشد.در تمرین زیر یک رشته متن که توسط کاربر ایجاد شده را در حافظه ی داخلی دستگاه ذخیره می کنیم.

1.با استفاده از اکلیپس یک پروژه ی جدید با نام Files ایجاد کنید.

2.فایل main.xml را به صورت زیر ویرایش کنید:

 

<?xml version=”1.0” encoding=”utf-8”?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent” >
<TextView
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”Please enter some text”
/>
<EditText
android:id=”@+id/txtText1”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content” />
<Button
android:id=”@+id/btnSave”
android:text=”Save”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content” />
<Button
android:id=”@+id/btnLoad”
android:text=”Load”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content” />
</LinearLayout>

3.فایل MainActivity.java را به صورت زیر ویرایش کنید:

Title

package com.PRG.Files;
import android.app.Activity;
import android.view.View;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText textBox;
private static final int READ_BLOCK_SIZE = 100;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textBox = (EditText) findViewById(R.id.txtText1);
Button saveBtn = (Button) findViewById(R.id.btnSave);
Button loadBtn = (Button) findViewById(R.id.btnLoad);
saveBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String str = textBox.getText().toString();
try
{
FileOutputStream fOut =
openFileOutput(“textfile.txt”,
MODE_WORLD_READABLE);
OutputStreamWriter osw = new
OutputStreamWriter(fOut);
//---write the string to the file---
osw.write(str);
osw.flush();
osw.close();
//---display file saved message---
Toast.makeText(getBaseContext(),
“File saved successfully!”,
Toast.LENGTH_SHORT).show();
//---clears the EditText---
textBox.setText(“”);
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
});

4.برنامه را در شبیه ساز اجرا کنید.

5.متنی را در ابزار نمایش EditText تایپ کنید و سپس دکمه ی save را بزنید.

6.اگر فایل با موفقیت ذخیره شود, پیغامی با محتوای File saved successfully! توسط کلاس Toast نمایش داده می شود.

7.با کلیک کردن روی دکمه ی Load خواهید دید که متن ذخیره شده دوباره در ابزار نمایش EditText بازیابی خواهد شد.

روش کار

برای ذخیره کردن متن در فایل, از کلاس FileOutputStream استفاده می کنیم.متد ()openFileOutput یک فایل را برای نوشتن و با حالت مشخص شده باز می کند.در اینجا از ثابت MODE_WORLD_READABLE استفاده کرده ایم تا تعیین کنیم که یک فایل توسط برنامه های دیگر فقط قابل خواندن باشد و اجازه ی تغییرات بر روی این فایل را نداشته باشند.

 

FileOutputStream fOut =
openFileOutput(“textfile.txt”,
MODE_WORLD_READABLE);

به غیر از ثابت MODE_WORLD_READABLE می توانید حالت های زیر را تست کنید:

  • MODE_PRIVATE -- این فایل فقط توسط برنامه ای که آن را ایجاد کرده قابل دسترسی باشد.
  • MODE_APPEND -- برای اضافه شدن به یک فایل موجود.
  • MODE_WORLD_WRITEABLE -- همه ی برنامه ها بتوانند در آن تغیرات ایجاد کنند.

برای تبدیل یک جریان کاراکتر به یک جریان بایت, از کلاس OutputStreamWriter استفاده خواهیم کرد.به این صورت که یک سری از شئ FileOutputStream را به آن ارسال می کنیم:

 

OutputStreamWriter osw = new
OutputStreamWriter(fOut);

سپس از متد ()write برای نوشتن در فایل استفاده می کنیم.برای اینکه از نوشته شدن تمامی بایت ها اطمینان حاصل شود, متد ()flush را فراخوانی میکنیم.سپس متد ()close را برای بسته شدن فایل بکار می بریم:

 

osw.write(str);
osw.flush();
osw.close();

جهت خواندن محتوای یک فایل, از کلاس FileInputStream و InputStreamReader با هم استفاده می کنیم:

 

FileInputStream fIn =
openFileInput(“textfile.txt”);
InputStreamReader isr = new
InputStreamReader(fIn);

از آنجا که نمیدانیم حجم فایلی که قصد باز کردن آن را داریم به چه میزان است,محتوا به اندازه ی 100 کاراکتر خوانده شده و در یک buffer که یک آرایه ی کاراکتری است قرار می گیرد.پس از اتمام عملیات خواندن, کاراکترها درون شئ string قرار می گیرند:

 

char[] inputBuffer = new char[READ_BLOCK_SIZE];
String s = “”;
int charRead;
while ((charRead = isr.read(inputBuffer))>0)
{
//---convert the chars to a String---
String readString =
String.copyValueOf(inputBuffer, 0,
charRead);
s += readString;
inputBuffer = new char[READ_BLOCK_SIZE];
}

متد ()read شئ InputStreamReader تعداد کاراکترهای خوانده شده را کنترل کرده و زمانی که به پایان فایل برسد مقدار -1 را بر می گرداند.

در هنگام تست این برنامه بر روی شبیه ساز,میتوانید اکلیپس را به حالت DDMS perespective برده و از طریق مرورگر فایل, از ایجاد شدن فایل در فولدر برنامه اطمینان حاصل کنید.(در مسیر data-data-com.PRG.Files-files).

 ذخیره سازی در SD Card

در بعضی مواقع بهتر است که فایل ها در حافظه ی خارجی نگهداری شوند.چون این حافظه دارای فضای بیشتری بوده و قابلیت به اشتراک گذاری با دیگران را بسیار آسان کرده است.

در همان پروژه قبل برای اینکه رشته متنی را در حافظه ی خارجی ذخیره کنید, متد ()onClick دکمه ی Save را طبق کدهای زیر اطلاح کنید:

 

saveBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String str = textBox.getText().toString();
try
{
//---SD Card Storage---
File sdCard = Environment.getExternalStorageDirectory();
File directory = new File (sdCard.getAbsolutePath() +
“/MyFiles”);
directory.mkdirs();
File file = new File(directory, “textfile.txt”);
FileOutputStream fOut = new FileOutputStream(file);
OutputStreamWriter osw = new
OutputStreamWriter(fOut);
//---write the string to the file---
osw.write(str);
osw.flush();
osw.close();
//---display file saved message---
Toast.makeText(getBaseContext(),
“File saved successfully!”,
Toast.LENGTH_SHORT).show();
//---clears the EditText---
textBox.setText(“”);
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
});

کد بالا از متد ()getExternalStorageDirectory برای برگرداندن مسیر کامل حافظه خارجی استفاده کرده است.معمولاً این مسیر در یک دستگاه واقعی برابر /sdcard است,و در یک شبیه ساز اندروید /mnt/sdcard  است.اما هیچگاه سعی نکنید از مسیر یکسان استفاده کنید.چون هر سازنده دستگاهی ممکن است مسیر مختص به خود را داشته باشد.بنابراین همیشه از متد ()getExternalStorageDirectory برای دریافت مسیر حافظه خارجی استفاده کنید.

سپس در کارت حافظه یک فولدر با نام MyFile ایجاد کرده ایم,تا فایل را درون آن ذخیره کنیم.

برای بارگذاری فایل از حافظه خارجی, متد ()onClickLoad دکمه ی Load را به شکل زیر اصلاح کنید:

 

loadBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try
{
//---SD Storage---
File sdCard = Environment.getExternalStorageDirectory();
File directory = new File (sdCard.getAbsolutePath() +
“/MyFiles”);
File file = new File(directory, “textfile.txt”);
FileInputStream fIn = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fIn);
char[] inputBuffer = new char[READ_BLOCK_SIZE];
String s = “”;
int charRead;
while ((charRead = isr.read(inputBuffer))>0)
{
//---convert the chars to a String---
String readString =
String.copyValueOf(inputBuffer, 0, charRead);
s += readString;
inputBuffer = new char[READ_BLOCK_SIZE];
}
//---set the EditText to the text that has been
// read---
textBox.setText(s);
Toast.makeText(getBaseContext(),
“File loaded successfully!”,
Toast.LENGTH_SHORT).show();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
});

البته توجه داشته باشید که برای کار با حافظه خارجی باید مجوز WRITE_EXTERNAL_STORAGE را در فایل AndroidManifest.xml وارد کنید:

 

<?xml version=”1.0” encoding=”utf-8”?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”net.learn2develop.Files”
android:versionCode=”1”
android:versionName=”1.0”>
<application android:icon=”@drawable/icon” android:label=”@string/app_name”>
<activity android:name=”.MainActivity”
android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion=”9” />
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”>
</uses-permission>
</manifest>

اگر کد اطلاح شده ی بالا را اجرا کنید خواهید دید که یک فایل متنی در مسیر mnt/sdcard/MyFiles/ ایجاد شده است.

تمامی محصولات و خدمات این وبسایت، حسب مورد دارای مجوزهای لازم از مراجع مربوطه می‌باشند و فعالیت‌های این سایت تابع قوانین و مقررات جمهوری اسلامی ایران است.
logo-samandehi مجوز نشر دیجیتال از وزرات فرهنگ و ارشاد اسلامی پرداخت آنلاین -  بانک ملت معرفی بیاموز در شبکه سه