ذخیره اطلاعات با SharedPreferences ، در برنامه نویسی اندروید

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
فهرست تاپیک:

  1. ذخیره اطلاعات و تنظیمات برنامه، با SharedPreferences در برنامه نویسی اندروید
  2. استفاده از SharedPreferences برای ذخیره اطلاعات به صورت دائمی (تا هنگام uninstall برنامه)، در برنامه نویسی اندروید


منبع: kelidestan.com
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
ذخیره اطلاعات و تنظیمات برنامه، با SharedPreferences در برنامه نویسی اندروید

ذخیره اطلاعات و تنظیمات برنامه، با SharedPreferences در برنامه نویسی اندروید

در برنامه نویسی اندروید، SharedPreferences برای ذخیره اطلاعات و تنظیمات برنامه، می تواند به کار رود، به گونه ای که اگر کاربر اطلاعاتی را وارد کرد یا گزینه هایی را انتخاب نمود، با خارج شدن وی از برنامه (بستن برنامه یا خاموش کردن گوشی)، آن اطلاعات و انتخاب ها، از دست نرود.


در ادامه، یک برنامه اندروید می سازیم که در آن، کاربر، ((نام)) و ((سن)) خود را در برنامه وارد می کند و چنانچه برنامه را ببندد و دوباره وارد برنامه شود، گزینه های وارد شده توسط وی، همچنان در کادر ورود اطلاعات، نمایش داده می شود (اگر بخواهد می تواند آنها را تغییر دهد، ولی به هر حال، مجبور نیست دوباره آنها را وارد نماید).


در برنامه eclipse ، ابتدا یک پروژه اندروید با نام Kelidestan.com_SharedPreferences می سازیم (نام package را برابر com.kelidestan.sharedpreferences انتخاب می کنیم. نام activity اصلی را برابر MainActivity انتخاب می کنیم و فایل xml متناظر آن را هم برابر activity_main قرار می دهیم).


در زیرمجموعه فولدر res ، یک فولدر با نام xml می سازیم و سپس درون آن، یک فایل xml ، با نام prefs.xml می سازیم :

android-143.jpg

کدهای فایل prefs.xml را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]PreferenceScreen xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR] [COLOR=#339933]>[/COLOR]
    [COLOR=#339933]<[/COLOR]EditTextPreference android[COLOR=#339933]:[/COLOR]key[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"name"[/COLOR] android[COLOR=#339933]:[/COLOR]title[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/name"[/COLOR]android[COLOR=#339933]:[/COLOR]summary[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/name_summary"[/COLOR][COLOR=#339933]/>[/COLOR]
    [COLOR=#339933]<[/COLOR]EditTextPreference android[COLOR=#339933]:[/COLOR]title[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/age"[/COLOR] android[COLOR=#339933]:[/COLOR]key[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"age"[/COLOR]android[COLOR=#339933]:[/COLOR]summary[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/age_summary"[/COLOR][COLOR=#339933]/>[/COLOR]
    
[COLOR=#339933]</[/COLOR]PreferenceScreen[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
که در آن، دو EditTextPreference تعریف کرده ایم. بنابراین، دو EditTextPreference خواهیم داشت که کاربر باید ((نام)) و ((سن)) خود را در آن وارد کند. با خروج کاربر از برنامه، مقادیر وارد شده توسط وی، از بین نمی رود و درون EditTextPreference ها، دوباره همان مقادیر، نمایش داده می شود.

اگر در کدهای بالا دقت کنید، متوجه می شوید که به 4 رشته (string) ارجاع داده ایم (با نام های name و name_summary و age و age_summary) که همگی باید در فایل strings.xml تعریف شوند. بنابراین باید فایل strings.xml را باز کنیم :

android-146.jpg


کدهای فایل strings.xml را به صورت زیر می نویسیم (تعریف 4 رشته ذکر شده) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]resources[COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"app_name"[/COLOR][COLOR=#339933]>[/COLOR]Kelidestan.[COLOR=#006633]com_SharedPreferences[/COLOR][COLOR=#339933]</[/COLOR]string[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"action_settings"[/COLOR][COLOR=#339933]>[/COLOR]Settings[COLOR=#339933]</[/COLOR]string[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"hello_world"[/COLOR][COLOR=#339933]>[/COLOR]Hello world[COLOR=#339933]!</[/COLOR]string[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"name"[/COLOR][COLOR=#339933]>[/COLOR]name[COLOR=#339933]</[/COLOR]string[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"name_summary"[/COLOR][COLOR=#339933]>[/COLOR]Enter your name[COLOR=#339933]</[/COLOR]string[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"age"[/COLOR][COLOR=#339933]>[/COLOR]age[COLOR=#339933]</[/COLOR]string[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"age_summary"[/COLOR][COLOR=#339933]>[/COLOR]Enter your age[COLOR=#339933]</[/COLOR]string[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]<[/COLOR]string name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"server"[/COLOR][COLOR=#339933]>[/COLOR]server[COLOR=#339933]</[/COLOR]string[COLOR=#339933]>[/COLOR]

[COLOR=#339933]</[/COLOR]resources[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
یک کلاس (class) با نام Prefs.java می سازیم :

android-144.jpg

پس از ساخت کلاس (class)، کدهای آن به صورت زیر می باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.sharedpreferences[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] Prefs [COLOR=#009900]{[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
کدهای آن را به صورت زیر تغییر می دهیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.sharedpreferences[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.preference.PreferenceActivity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.Menu[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] Prefs [B]extends[/B] PreferenceActivity [COLOR=#009900]{[/COLOR]
        
        @Override
        [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                addPreferencesFromResource[COLOR=#009900]([/COLOR]R.[COLOR=#006633]xml[/COLOR].[COLOR=#006633]prefs[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [COLOR=#666666][I]// setContentView(R.layout.activity_main);[/I][/COLOR]
        [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
بنابراین از ویژگی های کلاس PreferenceActivity ، در این کلاس، استفاده خواهد شد (ساخت کلاس Prefs ، بر اساس توسعه دادن کلاس PreferenceActivity).

اکنون، باید فایل AndroidManifest.xml را باز کنیم :

android-145.jpg


کدهای فایل AndroidManifest.xml ، به صورت زیر می باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]manifest xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    [B]package[/B][COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.sharedpreferences"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionCode[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionName[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] [COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]sdk
        android[COLOR=#339933]:[/COLOR]minSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"8"[/COLOR]
        android[COLOR=#339933]:[/COLOR]targetSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"17"[/COLOR] [COLOR=#339933]/>[/COLOR]

    [COLOR=#339933]<[/COLOR]application
        android[COLOR=#339933]:[/COLOR]allowBackup[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"true"[/COLOR]
        android[COLOR=#339933]:[/COLOR]icon[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@drawable/ic_launcher"[/COLOR]
        android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR]
        android[COLOR=#339933]:[/COLOR]theme[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@style/AppTheme"[/COLOR] [COLOR=#339933]>[/COLOR]
        [COLOR=#339933]<[/COLOR]activity
            android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.sharedpreferences.MainActivity"[/COLOR]
            android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR] [COLOR=#339933]>[/COLOR]
            [COLOR=#339933]<[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
                [COLOR=#339933]<[/COLOR]action android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.action.MAIN"[/COLOR] [COLOR=#339933]/>[/COLOR]

                [COLOR=#339933]<[/COLOR]category android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.category.LAUNCHER"[/COLOR] [COLOR=#339933]/>[/COLOR]
            [COLOR=#339933]</[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
        [COLOR=#339933]</[/COLOR]activity[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]</[/COLOR]application[COLOR=#339933]>[/COLOR]

[COLOR=#339933]</[/COLOR]manifest[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
باید خط زیر را به کدها اضافه کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]activity android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]".Prefs"[/COLOR][COLOR=#339933]></[/COLOR]activity[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
بنابراین، در نهایت، کدهای فایل AndroidManifest.xml ، به صورت زیر خواهند بود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]manifest xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    [B]package[/B][COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.sharedpreferences"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionCode[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionName[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] [COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]sdk
        android[COLOR=#339933]:[/COLOR]minSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"8"[/COLOR]
        android[COLOR=#339933]:[/COLOR]targetSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"17"[/COLOR] [COLOR=#339933]/>[/COLOR]

    [COLOR=#339933]<[/COLOR]application
        android[COLOR=#339933]:[/COLOR]allowBackup[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"true"[/COLOR]
        android[COLOR=#339933]:[/COLOR]icon[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@drawable/ic_launcher"[/COLOR]
        android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR]
        android[COLOR=#339933]:[/COLOR]theme[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@style/AppTheme"[/COLOR] [COLOR=#339933]>[/COLOR]
        [COLOR=#339933]<[/COLOR]activity
            android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.sharedpreferences.MainActivity"[/COLOR]
            android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR] [COLOR=#339933]>[/COLOR]
            [COLOR=#339933]<[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
                [COLOR=#339933]<[/COLOR]action android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.action.MAIN"[/COLOR] [COLOR=#339933]/>[/COLOR]

                [COLOR=#339933]<[/COLOR]category android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.category.LAUNCHER"[/COLOR] [COLOR=#339933]/>[/COLOR]
            [COLOR=#339933]</[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
        [COLOR=#339933]</[/COLOR]activity[COLOR=#339933]>[/COLOR]
        [COLOR=#339933]<[/COLOR]activity android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]".Prefs"[/COLOR][COLOR=#339933]></[/COLOR]activity[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]</[/COLOR]application[COLOR=#339933]>[/COLOR]

[COLOR=#339933]</[/COLOR]manifest[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
خوب، تاکنون activity مربوط به SharedPreferences را با نام Pref (فایل Pref.java) ساختیم و تنظیمات مورد نظرمان را هم به آن اعمال نمودیم. اما اکنون باید گزینه ای در برنامه قرار بدهیم که توسط آن، کاربر وارد activity با نام Pref بشود. برای این منظور، باید یک دکمه (button) در activity اصلی برنامه بسازیم که کاربر با اشاره بر روی آن، وارد activity با نام Pref بشود.

ابتدا فایل activity_main.xml را که برای نمایش activity اصلی برنامه اندروید به کار می رود، باز می کنیم :
android-147.jpg

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



android-148.jpg

مشاهده می کنید که به طور پیش فرض، دارای یک TextView می باشد. ابتدا TextView را حذف کرده و سپس یک Button در آن قرار می دهیم :

android-149.jpg

بنابراین ، شکل زیر را خواهیم داشت :


android-150.jpg

سپس در properties مربوط به Button ، باید ببینیم که id آن چیست (یا id دلخواه خود را تعریف کنیم) :

android-151.png

بنابراین id مربوط به Button ، برابر button1 می باشد (آن را بعدا نیاز داریم).
اکنون باید به سراغ فایل MainActivity.java برویم، که همان فایل مربوط به activity اصلی برنامه اندروید ما می باشد :

android-152.jpg

در ابتدا، کدهای آن به صورت زیر می باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.sharedpreferences[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.Menu[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]

        @Override
        [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]

        @Override
        [B]public[/B] [COLOR=#000066][B]boolean[/B][/COLOR] onCreateOptionsMenu[COLOR=#009900]([/COLOR][COLOR=#003399]Menu[/COLOR] menu[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [COLOR=#666666][I]// Inflate the menu; this adds items to the action bar if it is present.[/I][/COLOR]
                getMenuInflater[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]inflate[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]menu[/COLOR].[COLOR=#006633]main[/COLOR], menu[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [B]return[/B] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
کدها را به صورت زیر تغییر می دهیم (افزودن Button برای ارسال کاربر به activity با نام Prefs) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.sharedpreferences[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.content.Intent[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.Menu[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.View[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.View.OnClickListener[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.Button[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]

        @Override
        [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                
                [COLOR=#003399]Button[/COLOR] b [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#003399]Button[/COLOR][COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]button1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        b.[COLOR=#006633]setOnClickListener[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] OnClickListener[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                
                @Override
                [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onClick[COLOR=#009900]([/COLOR][COLOR=#003399]View[/COLOR] v[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        startActivity[COLOR=#009900]([/COLOR][B]new[/B] Intent[COLOR=#009900]([/COLOR]MainActivity.[B]this[/B], Prefs.[B]class[/B][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [COLOR=#009900]}[/COLOR]
        [COLOR=#009900]}[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]

        @Override
        [B]public[/B] [COLOR=#000066][B]boolean[/B][/COLOR] onCreateOptionsMenu[COLOR=#009900]([/COLOR][COLOR=#003399]Menu[/COLOR] menu[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [COLOR=#666666][I]// Inflate the menu; this adds items to the action bar if it is present.[/I][/COLOR]
                getMenuInflater[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]inflate[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]menu[/COLOR].[COLOR=#006633]main[/COLOR], menu[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [B]return[/B] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
برنامه اندروید آماده است و می توانید آن را به شیوه دلخواه خود، اجرا کنید و نتیجه را ببینید.

با اجرای برنامه اندروید، بر روی یک گوشی، صفحه زیر نمایش داده می شود :

android-153.jpg

با اشاره بر روی دکمه (Button)، صفحه زیر نمایش داده می شود :

android-154.jpg

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

android-155.jpg

در کادر، نام خود را می نویسیم و سپس بر روی گزینه OK اشاره می کنیم :

android-156.jpg

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

android-157.jpg

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

پیوست ها

  • 106.zip
    662.5 کیلوبایت · بازدیدها: 0
  • 107.rar
    179.7 کیلوبایت · بازدیدها: 0

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
استفاده از SharedPreferences برای ذخیره اطلاعات به صورت دائمی (تا هنگام uninstall برنامه)، در برنامه نویسی اندروید

استفاده از SharedPreferences برای ذخیره اطلاعات به صورت دائمی (تا هنگام uninstall برنامه)، در برنامه نویسی اندروید

روش هایی وجود دارد که برای ذخیره اطلاعات در برنامه اندروید به کار می روند، ولی عمر ذخیره اطلاعات، تنها به مدت زمان اجرای activity یا اجرای برنامه اندروید محدود می شود و با بسته شدن activity یا برنامه اندروید، آن اطلاعات نیز از بین می روند، اما گاهی نیاز داریم که اطلاعات را به گونه ای ذخیره کنیم که بعد از بسته شدن برنامه توسط کاربر و دوباره اجرا کردن برنامه، آن اطلاعات باز هم قابل بازیابی، تغییر و استفاده باشند. یک روش مناسب برای این منظور، استفاده از SharedPreferences می باشد. اطلاعاتی که با این روش ذخیره می شوند، تا زمانی که کاربر، برنامه اندروید را از روی گوشی خود حذف نکرده (uninstall نکرده) قابل خواندن و استفاده می باشند.

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

ابتدا باید در برنامه اندروید، یک کلاس (class) با نام Prefs بسازیم (یک فایل با نام Prefs.java). فایل Prefs.java باید شامل کدهایی مشابه کدهای زیر باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.package.name[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.content.SharedPreferences[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.preference.PreferenceActivity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.preference.PreferenceManager[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] Prefs [B]extends[/B] PreferenceActivity [COLOR=#009900]{[/COLOR]
    
    @Override
    [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            SharedPreferences prefs [COLOR=#339933]=[/COLOR] PreferenceManager.[COLOR=#006633]getDefaultSharedPreferences[/COLOR][COLOR=#009900]([/COLOR][B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

            [COLOR=#003399]String[/COLOR] myString [COLOR=#339933]=[/COLOR] prefs.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"myStringName"[/COLOR], [COLOR=#0000FF]""[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#003399]Boolean[/COLOR] myBoolean [COLOR=#339933]=[/COLOR] prefs.[COLOR=#006633]getBoolean[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"myBooleanName"[/COLOR], [COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]            
    [COLOR=#009900]}[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
که در آن، باید نام package را که در خط اول کدها نوشته ایم، به نام package برنامه اندروید خود تغییر بدهید.

اگر در کدها دقت کنید، کلاس Prefs را از توسعه PreferenceActivity ساخته ایم. این مورد، در خط زیر از کدها قابل مشاهده است :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]public[/B] [B]class[/B] Prefs [B]extends[/B] PreferenceActivity [COLOR=#009900]{[/COLOR][/FONT]
[/FONT][/COLOR]
اکنون به دو خط زیر از کدها دقت کنید :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]String[/COLOR] myString [COLOR=#339933]=[/COLOR] prefs.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"myStringName"[/COLOR], [COLOR=#0000FF]""[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#003399]Boolean[/COLOR] myBoolean [COLOR=#339933]=[/COLOR] prefs.[COLOR=#006633]getBoolean[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"myBooleanName"[/COLOR], [COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
در این دو خط، دو متغیر تعریف کرده ایم و می خواهیم که دو مقدار را در این دو متغیر ذخیره کنیم. مقادیری که در این دو متغیر ذخیره شود، تا زمانی که کاربر، برنامه اندروید را از گوشی خود حذف نکرده، قابل بازیابی است و از بین نمی روند (قابل خواندن یا تغییر دادن). بنابراین اگر مثلا می خواهید 10 مقدار مختلف را با استفاده از SharedPreferences ذخیره کنید، باید 10 متغیر برای آن 10 مقدار، در این کلاس تعریف کنید. برای تعداد زیاد مقادیر، می توان از یک آرایه استفاده نمود که در انتهای همین مبحث، در مورد آن کمی توضیح خواهیم داد.

متغیر اول را با نام myString و از نوع رشته (String) تعریف کرده ایم و متغیر دوم را با نام myBoolean و از نوع بولین (Boolean) می باشد. نیازی به حفظ کردن این دو نام نیست زیرا در سایر کدها که در activity های برنامه خواهیم نوشت، نیازی به به یاد داشتن آنها نیست، اما دو نامی که درون پرانتزها نوشته شده اند (یعنی myStringName و myBooleanName)، مهم می باشند و بعدا برای تغییر دادن مقدار این متغیرها، باید به آنها ارجاع بدهیم.

دقت کنید که عبارت های دومی که درون پرانتزها نوشته شده است، مقدار پیش فرض برای متغیرها می باشد. یعنی در پرانتز getString مقدار "" را نوشته ایم که به معنای رشته تهی می باشد، بنابراین اگر قبلا برای متغیر myString هیچ مقداری تعیین نکرده باشیم و سپس مقدار آن را از یک activity فراخوانی کنیم، یک رشته تهی به عنوان مقدار آن در نظر گرفته می شود. برای متغیر بولین (Boolean) هم مقدار true را در نظر گرفته ایم و بنابراین به طور پیش فرض، برابر true است (تا زمانی که مقدار دیگری برای آن تعیین نکنیم).

[h=2]تغییر یک مقدار تعریف شده توسط SharedPreferences :[/h]اکنون فرض کنید که بخواهیم مقدار مربوط به myString را در یک activity تغییر بدهیم (Prefs یک کلاس است که آن را ساخته ایم تا در activity های برنامه اندروید، از آن استفاده کنیم)، برای این منظور، در میان کدهای activity مورد نظر، کد زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]SharedPreferences shared [COLOR=#339933]=[/COLOR] getSharedPreferences[COLOR=#009900]([/COLOR][COLOR=#0000FF]"Prefs"[/COLOR], MODE_PRIVATE[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
SharedPreferences.[COLOR=#006633]Editor[/COLOR] editor [COLOR=#339933]=[/COLOR] shared.[COLOR=#006633]edit[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
editor.[COLOR=#006633]putString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"myStringName"[/COLOR], [COLOR=#0000FF]"myValue"[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
editor.[COLOR=#006633]apply[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
بنابراین عبارت myValue در آن رشته (String) ذخیره خواهد شد. دقت کنید که از putString استفاده کرده ایم.

فرض کنید بخواهیم مقدار متغیر بولین (Boolean) را تغییر بدهیم، برای این منظور، کدهای زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]SharedPreferences shared [COLOR=#339933]=[/COLOR] getSharedPreferences[COLOR=#009900]([/COLOR][COLOR=#0000FF]"Prefs"[/COLOR], MODE_PRIVATE[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
SharedPreferences.[COLOR=#006633]Editor[/COLOR] editor [COLOR=#339933]=[/COLOR] shared.[COLOR=#006633]edit[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
editor.[COLOR=#006633]putBoolean[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"myBooleanName"[/COLOR], [COLOR=#000066][B]false[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
editor.[COLOR=#006633]apply[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
بنابراین مقدار false در آن متغیر بولین (Boolean) ذخیره خواهد شد. دقت کنید که از putBoolean استفاده کرده ایم.

[h=2]خواندن یک مقدار تعریف شده توسط SharedPreferences :[/h]اگر بخواهیم مقدار ذخیره شده در آن رشته (String) را بخوانیم، باید کدهای زیر را بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]SharedPreferences shared [COLOR=#339933]=[/COLOR] getSharedPreferences[COLOR=#009900]([/COLOR][COLOR=#0000FF]"Prefs"[/COLOR], MODE_PRIVATE[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
SharedPreferences.[COLOR=#006633]Editor[/COLOR] editor [COLOR=#339933]=[/COLOR] shared.[COLOR=#006633]edit[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#003399]String[/COLOR] string_from_sp [COLOR=#339933]=[/COLOR] shared.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"myStringName"[/COLOR], [COLOR=#0000FF]""[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
دقت کنید که از getString استفاده کرده ایم. همچنین توجه داشته باشید که در پرانتز getString ، بعد از نام myStringName ، عبارت "" را نوشته ایم که به معنای آن است که اگر در SharedPreferences هیچ متغیری برای نام myStringName یافت نشد، این رشته به جای مقدار مورد نظرمان در نظر گرفته شود (عبارت "" یک رشته تهی است، شما می توانید رشته دیگری را به جای آن بنویسید)(مقدار پیش فرض).

اگر بخواهیم مقدار مربوط به متغیر بولین (Boolean) را بخوانیم، باید کدهای زیر را بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]SharedPreferences shared [COLOR=#339933]=[/COLOR] getSharedPreferences[COLOR=#009900]([/COLOR][COLOR=#0000FF]"Prefs"[/COLOR], MODE_PRIVATE[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
SharedPreferences.[COLOR=#006633]Editor[/COLOR] editor [COLOR=#339933]=[/COLOR] shared.[COLOR=#006633]edit[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]boolean[/B][/COLOR] boolean_from_sp [COLOR=#339933]=[/COLOR] shared.[COLOR=#006633]getBoolean[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"myBooleanName"[/COLOR], [COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
دقت کنید که از getBoolean استفاده کرده ایم. همچنین توجه داشته باشید که در پرانتز getBoolean ، بعد از نام myBooleanName ، مقدار true را نوشته ایم که به معنای آن است که اگر در SharedPreferences هیچ متغیری برای نام myStringName یافت نشد، مقدار true به جای مقدار مورد نظرمان در نظر گرفته شود (مقدار پیش فرض).

[h=2]استفاده از آرایه ها برای تعریف تعداد زیادی متغیر :[/h]در کدهای زیر نشان داده ایم که چگونه می توان تعداد زیادی متغیر در کلاس Prefs تعریف نمود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#666666][I]// String[/I][/COLOR]
[COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] all_strings [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR] [COLOR=#009900][[/COLOR][COLOR=#CC66CC]20[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
[B]for[/B][COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] x [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]1[/COLOR][COLOR=#339933];[/COLOR] x [COLOR=#339933]<[/COLOR] [COLOR=#CC66CC]21[/COLOR][COLOR=#339933];[/COLOR] x[COLOR=#339933]++[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
    [COLOR=#003399]String[/COLOR] name [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"string_"[/COLOR] [COLOR=#339933]+[/COLOR] [COLOR=#003399]String[/COLOR].[COLOR=#006633]valueOf[/COLOR][COLOR=#009900]([/COLOR]x[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    all_strings [COLOR=#009900][[/COLOR]x[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] prefs.[COLOR=#006633]getString[/COLOR][COLOR=#009900]([/COLOR]name, [COLOR=#0000FF]""[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR]
                        
[COLOR=#666666][I]// Boolean[/I][/COLOR]
[COLOR=#003399]Boolean[/COLOR] [COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] all_booleans [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]Boolean[/COLOR] [COLOR=#009900][[/COLOR][COLOR=#CC66CC]30[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
[B]for[/B][COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] x [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]1[/COLOR][COLOR=#339933];[/COLOR] x [COLOR=#339933]<[/COLOR] [COLOR=#CC66CC]31[/COLOR][COLOR=#339933];[/COLOR] x[COLOR=#339933]++[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
    [COLOR=#003399]String[/COLOR] name [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"boolean_"[/COLOR] [COLOR=#339933]+[/COLOR] [COLOR=#003399]String[/COLOR].[COLOR=#006633]valueOf[/COLOR][COLOR=#009900]([/COLOR]x[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    all_booleans [COLOR=#009900][[/COLOR]x[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] prefs.[COLOR=#006633]getBoolean[/COLOR][COLOR=#009900]([/COLOR]name, [COLOR=#000066][B]false[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
که در آن، آرایه رشته ای all_strings می تواند تعداد 20 مقدار رشته (String) و آرایه بولین all_booleans می تواند 30 مقدار بولین (Boolean) را در خود ذخیره کند. دقت شود که باید تنها به نام تعریف شده درون پرانتزها دقت کنید تا بعدا هنگام فراخوانی مقدار این متغیرها یا هنگام تغییر مقدار آنها، به این نام ها ارجاع بدهید (همان نکته ای که قبلا تذکر دادیم).
 
بالا