قسمت های دیگر این مطلب:

Shared Preferences‌ها در اندروید کاربرد ویژه و مهمی دارند. با استفاده از Shared Preferences‌ها می‌توان اطلاعات خاصی که برای ادامه کار نرم افزار مفید است را ذخیره کنیم.

مثلا فرض کنید بخواهید نام کاربر و یا سایز نوشته‌های مطالب را در جایی ذخیره کنید تا در هر بار اجرای نرم افزار تنظیمات محفوظ بمانند و نیازی نباشد همیشه این تنظیمات را از کاربر در خواست کنیم.

Shared Preferences در واقع یک فایل XML بسیار ساده است که در مسیر زیر ذخیره می‌شود:

data -> data -> package_name -> shared_prefs -> shared_preferences_name.xml

اگر نمی‌دانید XML چیست مطلب آشنایی با XML را از دست ندهید.

برای بهره برداری مناسب از Shared Preferences‌ها می‌توان Data Model خاص آن را طراحی کرد.

با توجه به مطالب گفته شده در قسمت قبل در مورد ساختار داده‌ها و Data Model‌های اندروید در این جا Data Model زیر را طراحی می‌کنیم:

package ir.hitos.models;

public class UserSharedPreferences {
    private Boolean first_time_run= true;
    private String first_name= "";
    private String last_name= "";

    public Boolean getFirst_time_run() {
        return first_time_run;
    }

    public void setFirst_time_run(Boolean first_time_run) {
        this.first_time_run = first_time_run;
    }

    public String getFirst_name() {
        return first_name;
    }

    public void setFirst_name(String first_name) {
        this.first_name = first_name;
    }

    public String getLast_name() {
        return last_name;
    }

    public void setLast_name(String last_name) {
        this.last_name = last_name;
    }
}

کلاس Data Model فوق که UserSharedPreferences نام دارد برای ذخیره سه داده، تشخیص اولین ورود کاربر به برنامه و ذخیره نام و نام خانوادگی کاربر ایجاد شده است.

تشخیص اولین ورود کاربر در برخی از برنامه‌ها که به عنوان مثال قصد دارند در اولین ورود یک راهنما به کاربر نمایش دهند مفید است.

مقدار پیش فرض first_time_run برابر true است، و پس از اولین اجرای نرم افزار این مقدار به false تغییر پیدا کند.

کلاسی برای مدیریت Shared Preferences‌ها به نام SharedPreferencesManager ایجاد می‌کنیم:

public class SharedPreferencesManager {
    private static final String SHARED_PREFERENCES_NAME = "user_shared_preferences";
    private SharedPreferences sharedPreferences;

    public SharedPreferencesManager(Context context) {
        sharedPreferences = context.getSharedPreferences(SHARED_PREFERENCES_NAME, context.MODE_PRIVATE);
    }

    public UserSharedPreferences get_shared_preferences() {
        UserSharedPreferences user = new UserSharedPreferences();
        user.setFirst_time_run(sharedPreferences.getBoolean("first_time_run", true));
        user.setFirst_name(sharedPreferences.getString("first_name", ""));
        user.setLast_name(sharedPreferences.getString("last_name", ""));
        return user;
    }

    public void set_false_first_time(UserSharedPreferences user) {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean("first_time_run", user.getFirst_time_run());
        editor.apply();
    }

    public void set_name(UserSharedPreferences user) {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("first_name", user.getFirst_name());
        editor.putString("last_name", user.getLast_name());
        editor.apply();
    }
}

سطر 2: متغیر SHARED_PREFERENCES_NAME برای تعیین نام فایل Shared Preferences استفاده می‌شود.

سطر 3: یک شی از SharedPreferences ایجاد می‌کنیم.

سطر 5: متد سازنده کلاس را در اینجا ایجاد می‌کنیم. ورودی متد سازنده context است و با getSharedPreferences فایل Shared Preferences را فراخوانی می‌کنیم. متد getSharedPreferences دو ورودی دارد که ورودی اول نام Shared Preferences و ورودی دوم سطح دسترسی  Shared Preferences است. اگر سطح دسترسی context.MODE_PRIVATE باشد تنها نرم افزار شما توانایی دسترسی به Shared Preferences را خواهد داشت. 

سطر 9: متد get_shared_preferences را از نوع UserSharedPreferences ایجاد می‌کنیم. وظیفه این متد فراخوانی اطلاعات موجود در فایل Shared Preferences است.

سطر 10: یک شی از نوع UserSharedPreferences و با نام user ایجاد می‌کنیم.

سطر 11: در این سطر با setFirst_time_run سعی در مقدار دهی آیتم first_time_run شی user داریم. با sharedPreferences.getBoolean مقدار از نوع boolean را دریافت می‌کنیم. نام این مقدار first_time_run است و اگر در فایل Shared Preferences آیتم first_time_run وجود نداشت مقدار true باز می‌گردد. طبیعتا در اولین اجرا این مقدار وجود ندارد و با بازگرداندن true اعلام می‌کنیم برنامه برای بار اول اجرا شده است.

سطر 12 و 14: در این سه سطر مقادیر first_name و last_name را مقدار دهی کرده و در آخر با return خارج می‌کنیم.

سطر 17: متد set_false_first_time با ورودی UserSharedPreferences وظیفه عوض کردن مقدار first_time_run به false را بر عهده دارد.

سطر18: با ایجاد متغیر editor از نوع SharedPreferences.Editor و با مقدار sharedPreferences.edit() قصد داریم مقادیر درون Shared Preferences را ویرایش کنیم.

سطر 19: در این سطر با editor.putBoolean قصد داریم در فایل Shared Preferences نرم افزار خود یک آیتم جدید به نام first_time_run ایجاد کنیم. مقدار این آیتم از سمت برنامه و در ورودی متد set_false_first_time قرار دارد.

سطر 20: با استفاده از متد apply تغییرات را در فایل Shared Preferences ثبت می‌کنیم. به جای apply می‌توانستیم از commit استفاده کنیم.

اگر از apply استفاده کنید عملیات در background انجام می‌شود و برنامه معطل ثبت شدن مقادیر Shared Preferences نمی‌ماند، و در صورتی از این متد استفاده می‌کنیم که به داده‌های ثبت شده در Shared Preferences بلافاصله پس از ثبت آن‌ها نیاز نداشته باشیم.

اگر از commit استفاده کنید فرایند ثبت Shared Preferences در thread فعلی انجام می‌پذیرد و برنامه کمی مکث کرده تا اطلاعات در Shared Preferences ثبت شده سپس فرایند اجرای برنامه ادامه پیدا می‌کند.

سطر 23: در این جا با متد set_name سعی در ذخیره مقادیر نام و نام خانوادگی در Shared Preferences داریم. مقادیر این متد از سمت برنامه تعیین می‌شوند.

لایه نمایش activity_main را مانند زیر ویرایش می‌کنیم:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="match_parent">

    <EditText
        android:id="@+id/first_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="77dp"
        android:ems="10"/>

    <EditText
        android:id="@+id/last_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:layout_centerVertical="true"
        android:layout_alignLeft="@+id/first_name"
        android:layout_alignStart="@+id/first_name" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:text="ذخیره"
        android:layout_below="@+id/last_name"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

لایه نمایشی فوق بسیار ساده است و از دو EditText و یک Button تشکیل شده است.

کلاس MainActivity سورسی معادل زیر دارد:

public class MainActivity extends AppCompatActivity{
    UserSharedPreferences user = new UserSharedPreferences();

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager(this);

        user = sharedPreferencesManager.get_shared_preferences();

        if(user.getFirst_time_run() == true){
            Toast.makeText(this, "این اولین باری است که برنامه اجرا می‌شود", Toast.LENGTH_SHORT).show();
            user.setFirst_time_run(false);
            sharedPreferencesManager.set_false_first_time(user);
        }else{
            Toast.makeText(this, "برای بار چندم است که برنامه اجرا شده است", Toast.LENGTH_SHORT).show();
        }

        final EditText first_name = (EditText) findViewById(R.id.first_name);
        final EditText last_name = (EditText) findViewById(R.id.last_name);

        first_name.setText(user.getFirst_name());
        last_name.setText(user.getLast_name());

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(first_name.getText() == null){
                    Toast.makeText(MainActivity.this, "نام را وارد کنید", Toast.LENGTH_SHORT).show();
                }else if(last_name.getText() == null){
                    Toast.makeText(MainActivity.this, "نام خانوادگی را وارد کنید", Toast.LENGTH_SHORT).show();
                }else{
                    user.setFirst_name(first_name.getText().toString());
                    user.setLast_name(last_name.getText().toString());
                    sharedPreferencesManager.set_name(user);
                    Toast.makeText(MainActivity.this, "اطلاعات با موفقیت ثبت شد", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

 سطر 2: یک شی به نام user از دیتا مدل کلاس UserSharedPreferences ایجاد کردیم.

سطر 9: با ایجاد شی sharedPreferencesManager از روی کلاس SharedPreferencesManager و با ورودی context شروع به استفاده از Shared Preferences برنامه می‌کنیم.

سطر 11: از شی sharedPreferencesManager متد get_shared_preferences را در خواست می‌دهیم تا تمام اطلاعات Shared Preferences برنامه در شی user بارگذاری شود.

سطرهای 13 تا 19: بررسی می‌کنیم getFirst_time_run برابر true است یا خیر. اگر برابر true بود یعنی برنامه برای بار اول است که اجرا می‌شود و پیام Toast مبنی بر اجرای دفعه اول برنامه نمایش داده شده و first_time_run شی user به false تغییر کرده و این تغییرات در سطر 15 به SharedPreferencesManager ارسال می‌شود. اگر هم مقدار getFirst_time_run برابر false بود تنها پیام اجرا شدن برای بار چندم نمایش داده می‌شود.

 سطرهای 21 و 22: دو editText موجود در لایه نمایش فراخوانی می‌شوند.

سطرها 24 و 25: دو editText لایه نمایش با اطلاعات دریافتی از سطر 11 مقدار دهی می‌شوند تا اطلاعات first_name و last_name در صورت موجود بودن نمایش داده شوند.

سطرهای 27 تا 42: در این سطرها ابتدا button موجود در لایه نمایش فراخوانی شده سپس با استفاده از setOnClickListener برنامه منتظر کلیک شدن روی این کلید می‌ماند. در صورت کلیک شدن روی button مقادیر وارد شده در دو editText ابتدا در شی user قرار گرفته سپس برای متد set_name کلاس SharedPreferencesManager برای ثبت شدن ارسال می‌شود.

اگر مراحل فوق را با موفقیت طی کنید نتیجه زیر را خواهید دید:

آموزش هیتوس shared Preferences

Shared Preferences‌ها را می‌توانید بدون Data Model‌ها مقدار دهی کنید ولی بهتر است که سازکار Data Model‌ها را در همه جا به کار بگیرید تا با برنامه نویسی اصولی آشنا شوید.

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

تگ ها: googleandroid / اندرویدandroid studio