مثال تعليمي حول تفضيلات Android المشتركة

في هذا البرنامج التعليمي، سنستخدم التفضيلات المشتركة في تطبيقنا الأندرويد لتخزين البيانات في شكل زوج المفتاح والقيمة.

نظرة عامة على التفضيلات المشتركة في الأندرويد

تسمح التفضيلات المشتركة للأنشطة والتطبيقات بالاحتفاظ بالتفضيلات، في شكل أزواج المفتاح والقيمة مشابهة للخريطة التي ستظل حتى عندما يُغلق المستخدم التطبيق. يخزن الأندرويد إعدادات التفضيلات المشتركة كملف XML في مجلد shared_prefs تحت مجلد DATA/data/{application package}. يمكن الحصول على مجلد DATA عن طريق استدعاء Environment.getDataDirectory(). SharedPreferences هو محدد للتطبيق، أي أن البيانات تضيع عند أداء أحد الخيارات التالية:

  • عند إلغاء تثبيت التطبيق
  • عند مسح بيانات التطبيق (من خلال الإعدادات)

كما يوحي الاسم، الغرض الرئيسي هو تخزين تفاصيل التكوين المحددة من قبل المستخدم، مثل إعدادات محددة للمستخدم، والحفاظ على تسجيل المستخدم في التطبيق. للوصول إلى التفضيلات، لدينا ثلاث واجهات برمجة تطبيقات للاختيار من بينها:

  • getPreferences() : يُستخدم من داخل نشاطك، للوصول إلى تفضيلات النشاط
  • getSharedPreferences() : يُستخدم من داخل نشاطك (أو سياق التطبيق الآخر)، للوصول إلى تفضيلات مستوى التطبيق
  • getDefaultSharedPreferences() : تستخدم على PreferenceManager ، للحصول على التفضيلات المشتركة التي تعمل بالتنسيق مع إطار التفضيل الشامل لنظام Android

في هذا البرنامج التعليمي سنستخدم getSharedPreferences(). يُعرف الأسلوب على النحو التالي: getSharedPreferences (String PREFS_NAME، int mode) PREFS_NAME هو اسم الملف. mode هو وضع التشغيل. فيما يلي وضعي التشغيل المطبقة:

  • MODE_PRIVATE: الوضع الافتراضي، حيث يمكن الوصول إلى الملف الذي تم إنشاؤه فقط من التطبيق الذي يستدعيه
  • MODE_WORLD_READABLE: إنشاء ملفات قابلة للقراءة من قبل العالم يعتبر أمرًا خطيرًا للغاية، ومحتملاً لتسبب ثغرات أمان في التطبيقات
  • MODE_WORLD_WRITEABLE: إنشاء ملفات قابلة للكتابة من قبل العالم يعتبر أمرًا خطيرًا للغاية، ومحتملاً لتسبب ثغرات أمان في التطبيقات
  • MODE_MULTI_PROCESS: سيتحقق هذا الأسلوب من تعديل التفضيلات حتى لو تم بالفعل تحميل مثيل التفضيل المشترك
  • MODE_APPEND: سيقوم هذا بإلحاق التفضيلات الجديدة بالتفضيلات الموجودة بالفعل
  • MODE_ENABLE_WRITE_AHEAD_LOGGING: علم فتح قاعدة البيانات. عند تعيينه، سيتم تمكين تسجيل الكتابة المتقدمة افتراضيًا

التهيئة

نحتاج إلى محرر لتحرير وحفظ التغييرات في تفضيلات المشاركة. يمكن استخدام الشيفرة التالية للحصول على تفضيلات المشاركة.

SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - for private mode
Editor editor = pref.edit();

تخزين البيانات

يتم استخدام editor.commit() لحفظ التغييرات في تفضيلات المشاركة.

editor.putBoolean("key_name", true); // Storing boolean - true/false
editor.putString("key_name", "string value"); // Storing string
editor.putInt("key_name", "int value"); // Storing integer
editor.putFloat("key_name", "float value"); // Storing float
editor.putLong("key_name", "long value"); // Storing long
 
editor.commit(); // commit changes

استرجاع البيانات

يمكن استرجاع البيانات من تفضيلات المحفوظات عن طريق استدعاء getString() على النحو التالي:

pref.getString("key_name", null); // getting String
pref.getInt("key_name", -1); // getting Integer
pref.getFloat("key_name", null); // getting Float
pref.getLong("key_name", null); // getting Long
pref.getBoolean("key_name", null); // getting boolean

مسح أو حذف البيانات

يتم استخدام remove(“اسم_المفتاح”) لحذف تلك القيمة الخاصة. clear() يتم استخدامها لإزالة جميع البيانات

editor.remove("name"); // will delete key name
editor.remove("email"); // will delete key email
 
editor.commit(); // commit changes
editor.clear();
editor.commit(); // commit changes

هيكل المشروع

كود مشروع تفضيلات Android Shared

تتكون صفحة تخطيط activity_main.xml من عرضين EditText يخزن ويعرض الاسم والبريد الإلكتروني. يقوم الأزرار الثلاثة بتنفيذ أحداث النقر الخاصة بها في MainActivity.

<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin" >

    <Button
        android:id="@+id/btnSave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:onClick="Save"
        android:text="Save" />

    <Button
        android:id="@+id/btnRetr"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:onClick="Get"
        android:text="Retrieve" />

    <Button
        android:id="@+id/btnClear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/etEmail"
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:onClick="clear"
        android:text="Clear" />

    <EditText
        android:id="@+id/etEmail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Email"
        android:inputType="textEmailAddress"
        android:layout_below="@+id/etName"
        android:layout_marginTop="20dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <EditText
        android:id="@+id/etName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Name"
        android:inputType="text"
        android:layout_alignParentTop="true"
        android:layout_alignLeft="@+id/etEmail"
        android:layout_alignStart="@+id/etEmail" />

</RelativeLayout>

يتم استخدام ملف MainActivity.java لحفظ واسترجاع البيانات من خلال المفاتيح.

package com.journaldev.sharedpreferences;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
    SharedPreferences sharedpreferences;
    TextView name;
    TextView email;
    public static final String mypreference = "mypref";
    public static final String Name = "nameKey";
    public static final String Email = "emailKey";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        name = (TextView) findViewById(R.id.etName);
        email = (TextView) findViewById(R.id.etEmail);
        sharedpreferences = getSharedPreferences(mypreference,
                Context.MODE_PRIVATE);
        if (sharedpreferences.contains(Name)) {
            name.setText(sharedpreferences.getString(Name, ""));
        }
        if (sharedpreferences.contains(Email)) {
            email.setText(sharedpreferences.getString(Email, ""));

        }

    }

    public void Save(View view) {
        String n = name.getText().toString();
        String e = email.getText().toString();
        SharedPreferences.Editor editor = sharedpreferences.edit();
        editor.putString(Name, n);
        editor.putString(Email, e);
        editor.commit();
    }

    public void clear(View view) {
        name = (TextView) findViewById(R.id.etName);
        email = (TextView) findViewById(R.id.etEmail);
        name.setText("");
        email.setText("");

    }

    public void Get(View view) {
        name = (TextView) findViewById(R.id.etName);
        email = (TextView) findViewById(R.id.etEmail);
        sharedpreferences = getSharedPreferences(mypreference,
                Context.MODE_PRIVATE);

        if (sharedpreferences.contains(Name)) {
            name.setText(sharedpreferences.getString(Name, ""));
        }
        if (sharedpreferences.contains(Email)) {
            email.setText(sharedpreferences.getString(Email, ""));

        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // نفخ القائمة. يتم ذلك بإضافة العناصر إلى شريط العمل إذا كان موجودًا. 
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

}

mypreference هو اسم الملف الذي يتم فيه تخزين القيمة المفضلة المشتركة. يظهر الصورة أدناه الناتج النهائي لمشروعنا: ينتهي هذا البرنامج التعليمي. يمكنك تنزيل مشروع Android Shared Preferences من الرابط أدناه.

تنزيل مشروع مثال تفضيلات Android Shared

Source:
https://www.digitalocean.com/community/tutorials/android-shared-preferences-example-tutorial