PDA

View Full Version : مشکل در درک کار SharedPrefrences ها



ghace.shh
دوشنبه 06 آذر 1396, 15:43 عصر
با سلام.
کد زیر رو از جایی گرفتم.درست هم کار میکنه ولی یه ابهامی در خصوص نحوه کار خطوطی که قرمز رنگشون کردم دارم
سوال اینکه:
این خطوط میگه مقدار متغیر Name رو از شی sharedpreferences بگیر و بریز توی shar1. درسته؟
سوال اینکه متغیر Name که یه متغیر ساده تعریف شده است چجوری وصل شد به sharedpreferences ؟
اصلا این دوتا کجا به هم ربط داده شدن؟
ممنون که جواب میدید.


EditText ed1,ed2,ed3;
Button b1;

public static final String MyREFERENCES = "MyPrefs" ;
public static final String Name = "nameKey";
public static final String Phone = "phoneKey";
public static final String Email = "emailKey";

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

ed1=(EditText)findViewById(R.id.editText);
ed2=(EditText)findViewById(R.id.editText2);
ed3=(EditText)findViewById(R.id.editText3);

b1=(Button)findViewById(R.id.button);
sharedpreferences = getSharedPreferences(MyREFERENCES, Context.MODE_PRIVATE);

//نمایش اطلاعات ذخیره شده
String shar1 = sharedpreferences.getString(Name,"");
String shar2 = sharedpreferences.getString(Phone,"");
String shar3 = sharedpreferences.getString(Email,"");

ed1.setText(shar1);
ed2.setText(shar2);
ed3.setText(shar3);

b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String n = ed1.getText().toString();
String ph = ed2.getText().toString();
String e = ed3.getText().toString();

//ذخیره اطلاعات
SharedPreferences.Editor editor = sharedpreferences.edit();

editor.putString(Name, n);
editor.putString(Phone, ph);
editor.putString(Email, e);
editor.commit();
Toast.makeText(MainActivity.this,"Thanks",Toast.LENGTH_LONG).show();


}
});
}
}

aliireza
دوشنبه 06 آذر 1396, 17:51 عصر
متغیر name یا هر متغیر دیگه‌ای ربطی به sharedpref نداره.
اون اینجا اینکارو کرده که کدها تمیز تر بشه و شما می‌تونید به این صورت عمل کنید.
String shar1 = sharedpreferences.getString("Shar_Pref_Name","");
این فقط یک مقدار رشته هست که به عنوان نام برای sharedPref قرار داده میشه.
Shar_Pref_Name به عنوان Key و "" به عنوان value که اینجا تهی هست.
شما هروقت بخواید مقدار این SharedPref رو فراخوانی بکنید باید با استفاده از Key این کارو انجام بدید که اینجا اسمش Shar_Pref_Name هست. میتونه هر نام دیگه‌ای باشه.
امیدوارم واضح توضیح داده باشم.

ghace.shh
دوشنبه 06 آذر 1396, 18:17 عصر
درود بر شما دوست عزیز.
الان یه سوال دیگه برام پیش اومد!
کلا این خط
String shar1 = sharedpreferences.getString("Shar_Pref_Name","");
قراره چیکار بکنه؟
یه مقدار تهی رو بریزه توی مثلا shar_pref_name بعد بریزه توی shar1 که چی بشه؟!
قبلا با C#‎‎‎ کار کردم.توی کلاس مثلا یه متغیر اگه باشه اول باید ایجاد بشه بعد اینجا بیاد مثلا مقدارشو بگیره.
اگه بتونی توضیح بدی که این خط براچی نوشته شده که بعدا چه استفاده ای ازش بشه ممنون میشم عزیزم.
ببخشید...

ghace.shh
دوشنبه 06 آذر 1396, 20:22 عصر
ممنون میشم دوستان حرفه ای جواب بدن....
تشکر....

Nevercom
سه شنبه 07 آذر 1396, 00:24 صبح
SharedPreferences یه دیتابیس ساده‌ی Key-Value هست. دیتابیس هست یعنی داده هایی که توش ذخیره میشه بعد از بسته شدن برنامه و باز شدن دوباره از بین نمیرن، و تا زمانی که برنامه Uninstall نشه یا خودتون داده ها رو پاک نکنین در دسترس هستن (مثلن اگر کاربر آپدیت جدید رو نصب کنه اون دیتا از بین نمیره). و Key-Value معنیش این هست که شما یه سری کلید دارید که هر کدوم یه مقدار رو نگهداری می کنن.

مثلن فرض کنید یه برنامه نوشتید که کاربر یه سری مطلب رو مطالعه می کنه و می‌خواید بهش امکان بدید که سایز فونت رو انتخاب کنه. برای اینکه این انتخاب کاربر بعد از بسته شدن اپ از بین نره، باید به نحوی این اطلاعات رو جایی خارج از حافظه موقت اپ ذخیره کنید. در این حالت آپشن های شما می‌تونه دیتابیس SQLite باشه که برای این کار ساده پیچیدگی هاش زیاده. می‌تونید خودتون یه فایلی بسازید و این اطلاعات رو توش ذخیره کنید، که باز هم دردسرش زیاده برای کار ساده و ابتدایی ای مثل این و یا از SharedPreferences استفاده کنید که خیلی راحت این امکان رو بهتون میده.

کد ذخیره این انتخاب کاربر می‌تونه این شکلی باشه:


// Initializing the Object and get access to SP
SharedPrefernces prefs = getSharedPreferences("pref_name", Context.MODE_PRIVATE);


// Store an integer value
prefs.edit().putInt("font_size", 12).commit();


و خب، حالا که این مقدار رو دخیره کردید، دلتون می‌خواد که هربار که برنامه باز میشه سایز فونت رو متناسب با انتخاب کاربر تغییر بدید. شرط اول این کار این هست که مقدار انتخابی کاربر رو بدونید:


// Read int value from SP by its Key, and return 16 if no value is set
int fontSize = prefs.getInt("font_size", 16);

الان شما مقدار ذخیره شده رو توسط کلیدش که font_size هست بدست میارید. توجه می‌کنید که این کلیدی همون شناسه ای هست که هنگام ذخیره و خوندن مجدد از SP ازش استفاده می کنیم و ثابت می‌مونه.
حالا اگه این کلید مقداری وجود نداشته باشه چی ؟ یعنی اصلن کاربر به صفحه‌ی تنظیمات نرفته که سایز فونت رو تغییر بده. در این شرایط بهتون اجازه می‌ده که مقدار پیشفرض هم تعیین کنید که درصورتی که اون کلید وجود نداشت، اون مقدار پیشفرض برگردونده بشه که در این مثال عدد 16 هست. زمانی که این کلید در SP ایجاد شد و مقدار گرفت، دیگه اون عدد 16 پیشفرض برگردونده نمیشه، مگر اینکه بعدها بیاید و اون کلید زو از SP حذف کنید.

این کدی که نوشتید کارش اینه که در هنگام اجرا، اول سه مقدار رو از SP می‌خونه که مربوط به نام، ایمیل و شماره تلفن هست. درصورتی که مقداری براشون وجود نداشته باشه، یه String خالی برگردونده میشه.
حالا مقدار این متعیرها رو در EditText ها نمایش میده. در اولین اجرای برنامه هیچکدوم از این سه کلید وجود ندارن پس در EditText ها یه رشته ی خالی نمایش داده میشه.

حالا اگه کاربر این EditText رو پر کنه، و بعد روی اون Button خاص کلیک کنه، سه مقداری که در EditText ها نوشنه شدن، در SP با سه کلید متفاوت ذخیره میشن.

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

یه مثال ساده برای SP رو قبلاً نوشته بودم که شاید بتونه برای درک بهتر موضوع بهتون کمک کنه: http://nevercom.blog.ir/post/run-codes-on-activity-first-launch

aliireza
سه شنبه 07 آذر 1396, 11:21 صبح
درود بر شما دوست عزیز.
الان یه سوال دیگه برام پیش اومد!
کلا این خط
String shar1 = sharedpreferences.getString("Shar_Pref_Name","");
قراره چیکار بکنه؟
یه مقدار تهی رو بریزه توی مثلا shar_pref_name بعد بریزه توی shar1 که چی بشه؟!
قبلا با C#‎‎‎‎ کار کردم.توی کلاس مثلا یه متغیر اگه باشه اول باید ایجاد بشه بعد اینجا بیاد مثلا مقدارشو بگیره.
اگه بتونی توضیح بدی که این خط براچی نوشته شده که بعدا چه استفاده ای ازش بشه ممنون میشم عزیزم.
ببخشید...


شما SharedPref رو یک نوع متغیر درنظر بگیر. اون خط کدی که اشاره کردید میاد مقداری که برای Shar_Pref_Name تعیین شده رو میریزه توی shar1 . شما مستقیم هم میتونید ازش استفاده کنید و لازم نیست حتما اون رو داخل یک متغیر دیگه بریزید.
اون مقدار تهی که شما اشاره کردید در واقع مقدار پیش‌فرض Shar_Pref_Name هست. هر متغیر SharedPref که تعیین می‌کنید یک مقدار پیش فرض داره و یک مقدار اصلی که شما بعدا خودتون ست می‌کنید. وقتی متغیر SharedPref شما از نوع رشته باشه، طبیعتا مقدار پیش‌فرض هم باید یک رشته باشه (در این خط کد مقدار پیش فرض ما تهی هست). اگر متغیر شما یک Int باشه، مقدار پیش‌فرض باید Int باشه و همینجور برای متغیرهای دیگه.
اگر دقت کنید تو این خط کد ما getString کردیم. یعنی می‌خوایم یک String دریافت کنیم. برای متغیرهای نوع دیگه مثلا Int باید getInt کنیم و برای متغیرهای دیگه همینجور.
به عبارت دیگه این خط کد میگه که مقدار متغیر به نام Shar_Pref_Name (که اینجا از نوع String هست) رو که مقدار پیش فرضش "" یا تهی هست بگیر بریز توی یه متغیر دیگه (که اینجا اسمش shar1 هست) حالا اگر شما تا حالا مقداری برای این متغیر Shar_Pref_Name ست نکرده باشی، همون تهی رو برمیگردونه (چون مقدار پیش فرضش تهی ست شده). ولی اگر مقداری ست کرده باشی اون مقداری که شما ست کردی رو برمیگردونه.
امیدوارم متوجه شده باشید.
اگر سوالی بود در خدمتم

ghace.shh
سه شنبه 07 آذر 1396, 23:23 عصر
درود بر شما دوستان عزیز.قبلا با زبانهای زیادی برنامه نوشتم.
همین که گفتید مقدار تهی در واقع پیشفرض هست اگه قبلا متغیر مقدار دهی نشده بود گرفتم مطلبو.
ممنونم بابت زمانی که برای جواب به سوالم گذاشتید.
یا حسین(ع)...:قلب:

ASKaffash
سه شنبه 14 آذر 1396, 07:43 صبح
سلام
ممنون بابت توضیحات کامل پس یعنی شبیه به رجیستری ویندوز است ؟


SharedPreferences یه دیتابیس ساده‌ی Key-Value هست. دیتابیس هست یعنی داده هایی که توش ذخیره میشه بعد از بسته شدن برنامه و باز شدن دوباره از بین نمیرن، و تا زمانی که برنامه Uninstall نشه یا خودتون داده ها رو پاک نکنین در دسترس هستن (مثلن اگر کاربر آپدیت جدید رو نصب کنه اون دیتا از بین نمیره). و Key-Value معنیش این هست که شما یه سری کلید دارید که هر کدوم یه مقدار رو نگهداری می کنن.

مثلن فرض کنید یه برنامه نوشتید که کاربر یه سری مطلب رو مطالعه می کنه و می‌خواید بهش امکان بدید که سایز فونت رو انتخاب کنه. برای اینکه این انتخاب کاربر بعد از بسته شدن اپ از بین نره، باید به نحوی این اطلاعات رو جایی خارج از حافظه موقت اپ ذخیره کنید. در این حالت آپشن های شما می‌تونه دیتابیس SQLite باشه که برای این کار ساده پیچیدگی هاش زیاده. می‌تونید خودتون یه فایلی بسازید و این اطلاعات رو توش ذخیره کنید، که باز هم دردسرش زیاده برای کار ساده و ابتدایی ای مثل این و یا از SharedPreferences استفاده کنید که خیلی راحت این امکان رو بهتون میده.

کد ذخیره این انتخاب کاربر می‌تونه این شکلی باشه:


// Initializing the Object and get access to SP
SharedPrefernces prefs = getSharedPreferences("pref_name", Context.MODE_PRIVATE);


// Store an integer value
prefs.edit().putInt("font_size", 12).commit();


و خب، حالا که این مقدار رو دخیره کردید، دلتون می‌خواد که هربار که برنامه باز میشه سایز فونت رو متناسب با انتخاب کاربر تغییر بدید. شرط اول این کار این هست که مقدار انتخابی کاربر رو بدونید:


// Read int value from SP by its Key, and return 16 if no value is set
int fontSize = prefs.getInt("font_size", 16);

الان شما مقدار ذخیره شده رو توسط کلیدش که font_size هست بدست میارید. توجه می‌کنید که این کلیدی همون شناسه ای هست که هنگام ذخیره و خوندن مجدد از SP ازش استفاده می کنیم و ثابت می‌مونه.
حالا اگه این کلید مقداری وجود نداشته باشه چی ؟ یعنی اصلن کاربر به صفحه‌ی تنظیمات نرفته که سایز فونت رو تغییر بده. در این شرایط بهتون اجازه می‌ده که مقدار پیشفرض هم تعیین کنید که درصورتی که اون کلید وجود نداشت، اون مقدار پیشفرض برگردونده بشه که در این مثال عدد 16 هست. زمانی که این کلید در SP ایجاد شد و مقدار گرفت، دیگه اون عدد 16 پیشفرض برگردونده نمیشه، مگر اینکه بعدها بیاید و اون کلید زو از SP حذف کنید.

این کدی که نوشتید کارش اینه که در هنگام اجرا، اول سه مقدار رو از SP می‌خونه که مربوط به نام، ایمیل و شماره تلفن هست. درصورتی که مقداری براشون وجود نداشته باشه، یه String خالی برگردونده میشه.
حالا مقدار این متعیرها رو در EditText ها نمایش میده. در اولین اجرای برنامه هیچکدوم از این سه کلید وجود ندارن پس در EditText ها یه رشته ی خالی نمایش داده میشه.

حالا اگه کاربر این EditText رو پر کنه، و بعد روی اون Button خاص کلیک کنه، سه مقداری که در EditText ها نوشنه شدن، در SP با سه کلید متفاوت ذخیره میشن.

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

یه مثال ساده برای SP رو قبلاً نوشته بودم که شاید بتونه برای درک بهتر موضوع بهتون کمک کنه: http://nevercom.blog.ir/post/run-codes-on-activity-first-launch