SharedPreferences
احفظوا بيانات بسيطة بصيغة مفتاح-قيمة بين جلسات التطبيق باستخدام SharedPreferences. تعلّموا حفظ التفضيلات وقراءتها وإزالتها.
SharedPreferences درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 4 من أصل 6. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 6 دروس في المجموع.
خيارات التخزين الدائم
يوفر Android عدة طرق لتخزين البيانات محليًا:
- SharedPreferences — أزواج بسيطة من المفتاح والقيمة (الإعدادات والرموز المميزة)
- Room — قاعدة بيانات SQLite منظمة (للبيانات المعقدة)
- DataStore — البديل غير المتزامن الحديث لـ SharedPreferences
- Files — إدخال وإخراج الملفات الخام
يُعد SharedPreferences مناسبًا جدًا للإعدادات البسيطة وتفضيلات المستخدم.
ما هو SharedPreferences؟
يخزن SharedPreferences البيانات على شكل أزواج من المفتاح والقيمة في ملف XML على الجهاز. ويدعم:
- String
- Int / Long / Float
- Boolean
- Set<String>
تبقى البيانات محفوظة بعد إعادة تشغيل التطبيق وتنجو من تغييرات الإعدادات (مثل التدوير).
الحصول على مثيل SharedPreferences
طريقتان للحصول على كائن SharedPreferences:
// 1. Named preferences (shared across activities)
val prefs = getSharedPreferences(
"MyAppPrefs", // file name
Context.MODE_PRIVATE // only your app can read it
)
// 2. Activity's default preferences
val prefs = getPreferences(Context.MODE_PRIVATE)كتابة البيانات
استخدم Editor لكتابة القيم، ثم استدعِ apply():
val prefs = getSharedPreferences("MyAppPrefs", Context.MODE_PRIVATE)
prefs.edit()
.putString("username", "alice")
.putInt("login_count", 5)
.putBoolean("dark_mode", true)
.apply() // async, non-blocking — preferred over commit()
// Kotlin extension (cleaner syntax):
with(prefs.edit()) {
putString("username", "alice")
apply()
}قراءة البيانات
اقرأ القيم باستخدام المفتاح، مع توفير قيمة افتراضية إذا لم يكن المفتاح موجودًا:
val prefs = getSharedPreferences("MyAppPrefs", Context.MODE_PRIVATE)
val username = prefs.getString("username", "Guest") // default: "Guest"
val count = prefs.getInt("login_count", 0) // default: 0
val darkMode = prefs.getBoolean("dark_mode", false) // default: false
println("Hello, $username! Logins: $count. Dark: $darkMode")مثال عملي: تبديل السمة
احفظ إعداد الوضع الداكن واستعده:
class SettingsActivity : AppCompatActivity() {
private lateinit var binding: ActivitySettingsBinding
private lateinit var prefs: SharedPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySettingsBinding.inflate(layoutInflater)
setContentView(binding.root)
prefs = getSharedPreferences("settings", MODE_PRIVATE)
// Restore saved state
binding.switchDarkMode.isChecked = prefs.getBoolean("dark_mode", false)
binding.switchDarkMode.setOnCheckedChangeListener { _, isChecked ->
prefs.edit().putBoolean("dark_mode", isChecked).apply()
}
}
}حفظ رمز تسجيل الدخول
خزّن رمز المصادقة وتحقّق منه بعد إعادة تشغيل التطبيق:
// Save token after login
fun saveToken(token: String) {
getSharedPreferences("auth", MODE_PRIVATE)
.edit()
.putString("token", token)
.apply()
}
// Check if user is logged in
fun isLoggedIn(): Boolean {
val token = getSharedPreferences("auth", MODE_PRIVATE)
.getString("token", null)
return token != null
}
// Clear on logout
fun logout() {
getSharedPreferences("auth", MODE_PRIVATE)
.edit()
.remove("token")
.apply()
}إزالة البيانات ومسحها
أزل مفاتيح محددة أو امسح جميع البيانات:
.remove("key")— حذف إدخال واحد.clear()— حذف كل شيء في الملف
استدعِ دائمًا .apply() (أو .commit() إذا كنت تحتاج إلى تأكيد متزامن).
SharedPreferences مقابل DataStore
يعمل SharedPreferences جيدًا، لكنه يملك بعض القيود:
- قد تؤدي القراءات المتزامنة إلى حظر الخيط الرئيسي
- لا يوفر أمان الأنواع
Jetpack DataStore هو البديل الحديث — غير متزامن بالكامل مع Kotlin Flow وأمان الأنواع. بالنسبة إلى المشاريع الجديدة، يُفضّل استخدام DataStore. ولا يزال SharedPreferences مستخدمًا على نطاق واسع ومناسبًا تمامًا للكميات الصغيرة من البيانات.
اختبار سريع
ما الدالة التي تحفظ البيانات في SharedPreferences بشكل غير متزامن من دون حظر خيط واجهة المستخدم؟
مراجعة: SharedPreferences
يمكنك الآن حفظ البيانات البسيطة بشكل دائم بين مرات تشغيل التطبيق:
- الحصول عليها باستخدام
getSharedPreferences(name, MODE_PRIVATE) - الكتابة:
.edit().putString(key, value).apply() - القراءة:
.getString(key, defaultValue) - الإزالة:
.edit().remove(key).apply() - استخدم
apply()(غير متزامن) بدلًا منcommit()(متزامن)
الدورة التالية: بنية التطبيقات — ViewModel وRoom وCoroutines.
تعلم Kotlin مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 36
- الدروس
- 152
الأسئلة الشائعة
هل درس «SharedPreferences» مجاني؟
نعم — نص درس «SharedPreferences» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 6 دروس في المجموع.
ماذا ستتعلم في «SharedPreferences»؟
احفظوا بيانات بسيطة بصيغة مفتاح-قيمة بين جلسات التطبيق باستخدام SharedPreferences. تعلّموا حفظ التفضيلات وقراءتها وإزالتها. تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟
لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 6.
كم من الوقت يستغرق درس «SharedPreferences»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟
نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مجموعات Kotlin
- أساسيات RecyclerView
- أحداث النقر في RecyclerView
- SharedPreferences
- تفضيلات DataStore
- Adapters وDiffUtil