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

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

بسم الله الرحمن الرحیم

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

فصل ششم-بخش اول

  ماندگاری داده ها

بسم الله الرحمن الرحیم

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

فصل ششم-بخش اول

  ماندگاری داده ها

(Data Persistence)

 در  انتهای   فصل  با  موارد  زیر آشنامی  شوید:

  •  چگونه با  SharedPreferences یک  نوع داده ای  ساده را   ذخیره  کنید
  •  کاربران  را  قادر  می  سازید  تا  داده هایpreferences  را با   کلاسPreferenceActivity  تغییر  دهید
  •  یاد  می  گیرید  که  چگونه از  یک فایل   بخوانید و در آن  بنویسید
  • یک دیتابیس SQLite ایجاد   و  از آن استفاده می کنید

 

در پایان این  فصل یاد  می گیرید  که  چگونه   داده های   ماندگار   را در برنامه های  کاربری  خود  استفاده  کنید.  ماندگاری داده های  یک از  مهمتربن  مباحث در   تولید برنامه های  کاربردی  می باشد. که   کاربران     را  قادر می سازد  از داده های    ذخیره  شده  مجددا  استفاده  کنند.

در   اندروید   :   سه  روش برای   ذخیر ه  سازی  داده به   صورت  ماندگار   وجود  دارد  :

  •  یک  مکانیز    به  نام shared preferences  وجود  دارد که برای   ذخیره   سازی داده های  کوچک  استفاده می شود.
  •    ذخیره  سازی  بر روی  فایل  ها (که  روش  قدیمی است)
  •  سیستم  مدیریت  یکپارچه   پایگاه داده  که   اندروید  توسط    پایگاه دادهSQLite  پشتیبانی می شود

این     روش های  که در  این  فصل   شرح  میدهیم   برای    ذخیره  سازی  داد های  محلی  برای  برنامه  کاربردی  می باشد  . در  فصل  بعد  به  شما   یاد  میدهیم که  چگونه داده های  مشترک   بین   برنامه     استفاده   کنید.

 

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

 اندروید یک  شی SharedPreferences  به نام  فراهم  آورده  که   به شما    امکان  می دهد. داده  های  کوچک   برنامه  کاربردی را   ذخیره  کنید.

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

شما می توانید از  SharedPreferences  استفاده   کنید. زمانی که داده های   شما  به    صورت  name/value     (نام .  مقدار ) می  باشد    یعنی   برای  داده یک  نام    داده و  سپس  توسط همان   نام داده را  باز یابی  کنید   شما می توانید از    استفاده  SharedPreferences  کنید که  هر دو  name/value   برای  شما در  یک  فایل  Xml  ذخیره  می شود.

دسترسی به    تنظیمات  کاربر (Preferences)  با  استفاده  از  یک  Activity

در  مثال زیر  شما  یاد می گیرید که   چگونه  با   شی SharedPreferences داده ها  برنامه  را   ذخیره  و همچنین  چگونه داده  ها را  به   بازیابی  و  تغییر دهید

 

پروژه  جدیدی به نام UsingPreferences.  ایجاد  کنید

فولدر  جدیدی به نام xml. در     فولدر res  ایجاد  کنید در  فولدر ایجاد  فایل جدیدی به نام   ایجاد  myapppreferences.xml کنید   محتوای   فایل myapppreferences.xml    داده زیر وارد  کنید 

Preferences در اندروید

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="Category 1">
<CheckBoxPreference
android:title="Checkbox"
android:defaultValue="false"
android:summary="True or False"
android:key="checkboxPref" />
</PreferenceCategory>
<PreferenceCategory android:title="Category 2">
<EditTextPreference
android:summary="Enter a string"
android:defaultValue="[Enter a string here]"
android:title="Edit Text"
android:key="editTextPref" />
<RingtonePreference
android:summary="Select a ringtone"
android:title="Ringtones"
android:key="ringtonePref" />
<PreferenceScreen
android:title="Second Preference Screen"
android:summary="Click here to go to the second Preference Screen"
android:key="secondPrefScreenPref" >
<EditTextPreference
android:summary="Enter a string"
android:title="Edit Text (second Screen)"
android:key="secondEditTextPref" />
</PreferenceScreen>
</PreferenceCategory>
</PreferenceScreen>

درزیر package name  فایل کلاس جدیدی به  نام AppPreferenceActivity  ایجاد  کنید  محتوای  فایل  AppPreferenceActivity.java را  به صورت  زیر  قرار دهید


package com.MehrdadJavidi.usingpreferences;
import android.os.Bundle;
import android.preference.PreferenceActivity;
public class AppPreferenceActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**---load the preferences from an XML file---*/
addPreferencesFromResource(R.xml.myapppreferences);
}
}

در فایل AndroidManifest.xml  برای  AppPreferenceActivity  یک entry  جدید  وارد نمایید

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.MehrdadJavidi.usingpreferences"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="14" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.MehrdadJavidi.usingpreferences.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>
<activity android:name=".AppPreferenceActivity"
android:label="@string/app_name">
<intent-filter>
<action
android:name="com.MehrdadJavidi.AppPreferenceActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>

فایل main.xml به  صورت  زیر  تغییر دهید


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btnPreferences"
android:text="Load Preferences Screen"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClickLoad"/>
<Button
android:id="@+id/btnDisplayValues"
android:text="Display Preferences Values"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClickDisplay"/>
<EditText
android:id="@+id/txtString"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btnModifyValues"
android:text="Modify Preferences Values"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="onClickModify"/>
</LinearLayout>

فایل mainActivity.java به    صورت  زیر  تغییر دهید


package com.MehrdadJavidi.usingpreferences;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void onClickLoad(View view) {
Intent i = new Intent("com.MehrdadJavidi.AppPreferenceActivity");
startActivity(i);
}

برنامه را با  F11  اجرا  کنید    بر روی   دکمه  Load Preferences Screen کلیک کنید   پنجره  مشاهدهpreferences screen می کنید

Preferences در اندروید

checkbox  های   کلیک  کنید  آن های  به  حات  Cheaked   و  UnChecked  تغییر  دهید.وبروی editText کلیک  کنید  .در  دیالوگ  باز  شده   محتوای  editText  را  تغییر دهید.

بروی روی  Ringtones کلیک کنید شما می توانید را ringtone انتخاب  یا آن را در حالت   silent

قرار دهید.

توجه  کنید که  اگربرنامه در  دستگاه  واقعای اجرا  می  شد   شما  تعداد  بیشتر  ringtones. را  مشاهده می  کردید

Preferences در اندروید

برروی Second Preference Screen  کلیک گنید شما به    پنجره  بعدی  می روید

Preferences در اندروید

شما  با  فشار دادن  دکمه   Back button   به  پنجره  قبل  باز گردید

برای   dismissکردن ( به  طور کامل از  حافظه  حذف می ش شود) پنجرهpreferences  شما  می توانید از   دکمه  back استفاده   کنید.

زمانی که  شما داد های  مقادیر   پنجره preferences,   تغیر می دهید   یک  فایل  در  فولدر

/data/data/com.MehrdadJavidi.UsingPreferences/shared_prefs   در Android emulator ایجاد  می  کنید

برای  مشاهده  آن به   حالتDDMS  در  Eclipse  بروید  و FileExplorer ا  مشاهده   کنید  یک  فایل xml به نامcom.MehrdadJavidi.UsingPreferences_preferences.xml  وجود دارد

Preferences در اندروید

اگرا  فایل را  مشاهده  کنید  محتوای آن  به  صورت زیر می باشد.

<?xml version=’1.0’ encoding=’utf-8’ standalone=’yes’ ?>
<map>
<string name=”editTextPref”>[Enter a string here]</string>
<string name=”ringtonePref”></string>
</map>

توضیحات

در  ابتدا شما یک فایل xml   به نام myapppreferences.xml ایجاد  کردید  که تمام preferences که  میخواهید در  آن  ذخیره  می کنید

د

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="Category 1">
<CheckBoxPreference
android:title="Checkbox"
android:defaultValue="false"
android:summary="True or False"
android:key="checkboxPref" />
</PreferenceCategory>
<PreferenceCategory android:title="Category 2">
<EditTextPreference
android:summary="Enter a string"
android:defaultValue="[Enter a string here]"
android:title="Edit Text"
android:key="editTextPref" />
<RingtonePreference
android:summary="Select a ringtone"
android:title="Ringtones"
android:key="ringtonePref" />
<PreferenceScreen
android:title="Second Preference Screen"
android:summary="Click here to go to the second Preference Screen"
android:key="secondPrefScreenPref" >
<EditTextPreference
android:summary="Enter a string"
android:title="Edit Text (second Screen)"
android:key="secondEditTextPref" />
</PreferenceScreen>
</PreferenceCategory>
</PreferenceScreen>

در بالا شما  موارد  زیر را  ایجاد  کردید:

  •  دو  گروه (categories) برای  ذخیره   انواع    گرو های preferences
  • دو   چک باکس با  نام های کلیدی checkboxPref and secondEditTextPref
  •  یک ringtone  با  نام های  کلیدی ringtonePref
  •  یکpreference screen با preferences اضافی

  صفت (attribue) android:key   یک   کلید  تعریف می  کند  شما می توانید از   طرق   برنامه نویسی  به آن  دسترسی  داشته باشد و داداه های دریافت   یا   تغییر  دهید.

 

برای  اینکه   سیستم  عامل  اندروید  تمام  این preferences  را به  کاربر نمایش  دهد  تا  بتواند آن  ها را ویرایش  کند شما   باید از  activity که از  کلاس  پایه PreferenceActivity  مشتق  شده استفاده   کنید  سپس متدaddPreferencesFromResource()  را فراخوانی  کنید و   فایل xmlی که در بر   گیرنده می باشد  را  بارگزاری  کنید


package com.MehrdadJavidi.usingpreferences;
import android.os.Bundle;
import android.preference.PreferenceActivity;
public class AppPreferenceActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**---load the preferences from an XML file---*/
addPreferencesFromResource(R.xml.myapppreferences);
}
}

کلاس PreferenceActivity یک نوع   خاص از   activity را نمایش میدهد که می تمام  preferences را به   صورت   سلسله مراتبی به  کاربر نمایش می دهد.  برای  نماشی  این  activity  شما از  شی intent  به  صورت  زیر  استفاده   کنید


Intent i = new Intent("com.MehrdadJavidi.AppPreferenceActivity");
startActivity(i);

تمام  تغییرات   صورت  گرفته در preferences  به  صورت   اتوماتیک  در  فولدر shared_ prefs  ذخیره  می شود

 چگونه  با  برنامه نویسی   مقادیر Preferences را  تغییر و  باز   یابی  کنیم

در   قسمت   قبل  شما  یاد  گرفتید  که   کلاس  PreferenceActivity را  قادر می  سازد  مقادیر preferences را  در  زمان    اجرا   ذخیره  و  بازیابی   کند   برای استفاده از این  مقادیر در برنامه  شما می  توانید  از    کلاسSharedPreferences  استفاده   کنید   که  در زیر آن را   توضیح  می دهیم.

 در  پروژه  که  قبلا   ایجاد  کردیم به  فایلMainActivity.java بروید و آن را  به صورت زیر  تغییر دهید

برنامه را   با  زدن F11  اجرا  کنید

package com.MehrdadJavidi.usingpreferences;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void onClickLoad(View view) {
Intent i = new Intent("com.MehrdadJavidi.AppPreferenceActivity");
startActivity(i);
}
public void onClickDisplay(View view) {
SharedPreferences appPrefs =
getSharedPreferences("com.MehrdadJavidi.UsingPreferences_preferences",
MODE_PRIVATE);
DisplayText(appPrefs.getString("editTextPref", ""));
}
public void onClickModify(View view) {
SharedPreferences appPrefs =
getSharedPreferences("com.MehrdadJavidi.UsingPreferences_preferences",
MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = appPrefs.edit();
prefsEditor.putString("editTextPref",
((EditText) findViewById(R.id.txtString)).getText().toString());
prefsEditor.commit();
}
private void DisplayText(String str) {
Toast.makeText(getBaseContext(), str, Toast.LENGTH_LONG).show();
}
}

بر روی   دکمه   display Preferences  values کلیک کنید      مقادیر  نمایش داده می  شود.

Preferences در اندروید

در EditText  مقداری  وارد کنید و   بر روی Modify Preferences Values کلیک  کنید

Preferences در اندروید

حال  می توانید  بر روی   کلیک کنید  و  مقدار  جدیدی را  مشاهد  کنید

توضیحات

در  متدonClickDisplay()   , شما  با  متد getSharedPreferences() یک  نمونهSharedPreferences     بدست می آورید. شما یک  فایل  xml را  باید  تعیین   کنید  که  در  اینجا com.MehrdadJavidi.UsingPreferences_preferences می باشد برای   دریافت متن preference, از  متد  getString() استفاده می شود   که   پارامتر   ورودی آن  کلمه  کلیدی  می باشد که شما می خواهید آن رادریافت  کنید.

public void onClickDisplay(View view) {
SharedPreferences appPrefs =
getSharedPreferences("com.MehrdadJavidi.UsingPreferences_preferences",
MODE_PRIVATE);
DisplayText(appPrefs.getString("editTextPref", ""));
}

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

در  متد onClickModify() شما یک  شی  SharedPreferences.Editorرا از  طریق  متد  Eidt در  SharedPreferences ایجاد  کردید  برای  تغییر  preference,  شما از  متد  putString() استفاده  می کنید  برای  ذخیه      تغییرات در فایل شما از  متدcommit()  استفاده می کنید


public void onClickModify(View view) {
SharedPreferences appPrefs =
getSharedPreferences("com.MehrdadJavidi.UsingPreferences_preferences",
MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = appPrefs.edit();
prefsEditor.putString("editTextPref",
((EditText) findViewById(R.id.txtString)).getText().toString());
prefsEditor.commit();
}

تغییر  نام  پیش فرض  برای   فایل Preferences

باید  توجه   کنید  که  نام  پیش  فرض برای فایل  Preferences ها  که  بر روی  دستگاه  ایجاد و  ذخیره شده است com.MehrdadJavidi .UsingPreferences_preferences.xml  میباشد  که Packagename    قبل از  آن   قرار  گرفته است  اما  گاهی    اوقات  وجود  دارد  که می خواهید  نام آن را تغییر  دهید برای  ان   کار  روال زیر را انجام  میدهیم.

فایل AppPreferenceActivity.java به  صورت  زیر  تغییر می دهیم


package com.MehrdadJavidi.usingpreferences;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
public class AppPreferenceActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PreferenceManager prefMgr = getPreferenceManager();
prefMgr.setSharedPreferencesName("appPreferences");
/**---load the preferences from an XML file---*/
addPreferencesFromResource(R.xml.myapppreferences);
}
}

در اینجا شما یک   کلاس PreferenceManager ایجاد  کردید  که   نام  فایل به appPreferences.xml تنظیم  می  کند

 

فایل MainActivity.java به  صورت  زیر  تغییر دهید

public void onClickDisplay(View view) {
/*
SharedPreferences appPrefs =
getSharedPreferences("net.learn2develop.UsingPreferences_preferences",
MODE_PRIVATE);
*/
SharedPreferences appPrefs =
getSharedPreferences("appPreferences", MODE_PRIVATE);
DisplayText(appPrefs.getString("editTextPref", ""));
}
public void onClickModify(View view) {
/*
SharedPreferences appPrefs =
getSharedPreferences("net.learn2develop.UsingPreferences_preferences",
MODE_PRIVATE);
*/
SharedPreferences appPrefs =
getSharedPreferences("appPreferences", MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = appPrefs.edit();
prefsEditor.putString("editTextPref",
((EditText) findViewById(R.id.txtString)).getText().toString());
prefsEditor.commit();
}

شما می توانید  تغییرات را   مشاهده  کنید    نام فایل appPreferences.xml به  تغییر کرده  است

نظرات یا سوالات خودرا با ما درمیان بگذارید

0912 097 5516 :شماره تماس
0713 625 1757 :شماره تماس