ذخیره و بازیابی تنظیمات کاربر(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 داده زیر وارد کنید
<?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 می کنید
checkbox های کلیک کنید آن های به حات Cheaked و UnChecked تغییر دهید.وبروی editText کلیک کنید .در دیالوگ باز شده محتوای editText را تغییر دهید.
بروی روی Ringtones کلیک کنید شما می توانید را ringtone انتخاب یا آن را در حالت silent
قرار دهید.
توجه کنید که اگربرنامه در دستگاه واقعای اجرا می شد شما تعداد بیشتر ringtones. را مشاهده می کردید
برروی Second Preference Screen کلیک گنید شما به پنجره بعدی می روید
شما با فشار دادن دکمه Back button به پنجره قبل باز گردید
برای dismissکردن ( به طور کامل از حافظه حذف می ش شود) پنجرهpreferences شما می توانید از دکمه back استفاده کنید.
زمانی که شما داد های مقادیر پنجره preferences, تغیر می دهید یک فایل در فولدر
/data/data/com.MehrdadJavidi.UsingPreferences/shared_prefs در Android emulator ایجاد می کنید
برای مشاهده آن به حالتDDMS در Eclipse بروید و FileExplorer ا مشاهده کنید یک فایل xml به نامcom.MehrdadJavidi.UsingPreferences_preferences.xml وجود دارد
اگرا فایل را مشاهده کنید محتوای آن به صورت زیر می باشد.
<?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 کلیک کنید مقادیر نمایش داده می شود.
در EditText مقداری وارد کنید و بر روی Modify Preferences Values کلیک کنید
حال می توانید بر روی کلیک کنید و مقدار جدیدی را مشاهد کنید
توضیحات
در متد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 به تغییر کرده است