/6/i سلسلة تعلم الأندرويد -6- تخزين البيانات والملفات

6/i سلسلة تعلم الأندرويد -6- تخزين البيانات والملفات

تخزين البيانات من الموضوعات المهمة جدا في برمجة التطبيقات لأن المستخدم بيتوقع إعادة إستخدام البيانات في أي وقت لاحق لذلك في تطبيقاتنا بالتأكيد سنحتاج أن نقوم بتخزين بيانات مختلفة وملفات مثل الملفات النصية أو الصور أو حتي قواعد البيانات ، والأندرويد يتيح لنا عدة خيارات لحفظ البيانات الدائمة التي نحتاجها باستمرار في التطبيق ، واختيارنا للطريقة المناسبة لحفظ البيانات يعتمد علي احتياجات محددة مثل هل هذه البيانات يجب أن تكون خاصة بهذا التطبيق أم متاحة لأي تطبيق آخر ؟ وكم المساحة المطلوبة لحفظ هذه البيانات ؟

والخيارات المتاحة لحفظ البيانات كالآتي :

1-تفضيلات المستخدم Shared Preferences

نستخدمها لتخزين أنواع محددة من البيانات بشكل خاص في أزواج من مفتاح-قيمة.

2-قواعد البيانات SQLite Databases

تقوم بتخزين هياكل البيانات بشكل خاص في قواعد البيانات.

3-التخزين الداخلي Internal Storage

نستخدمها لتخزين ملفات خاصة في الذاكرة الداخلية للجهاز.

4-التخزين الخارجي External Storage

نستخدمها لتخزين ملفات غير خاصة في الذاكرة الخارجية للجهاز.

5-الاتصال بالشبكة Network Connection

تقوم بتخزين البيانات في الويب من خلال خوادم الشبكات.

أولا : استخدام الـ SharedPreferences :

الـ SharedPreferences عباره عن كلاس يساعدنا لحفظ بيانات التطبيق البسيطة فيمكن لأي تطبيق استخدامه بصوره سهلة وعملية لحفظ البيانات علي شكل أزواج من مفتاح/قيمة (key/value) هذا شبيه بالـ Bundle الذي استخدمناه في درس سابق.

هذه المعلومات يتم تخزينها في ملف xml بداخل الجهاز الذي يعمل عليه التطبيق.

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

إنشاء واسترجاع الـ SharedPreferences :

بيتم الوصول إلي الـ SharedPreferences لأي أكتفيتي باستخدام ميثود getPreferences التي تأخذ متغير واحد وهو لتحديد أسلوب العملية للملف المحدد تلقائيا لهذا الأكتفيتي ، وأسلوب العملية يوفر لنا التحكم في تصريح الوصول إلي التفضيلات من خلال أنواع مختلفة كالآتي

MODE_PRIVATE يتيح للتطبيق الحالي فقط الوصول إلي ملف الـ xml

MODE_WORLD_READABLE كل التطبيقات يمكنها قراءة ملف الـ xml

MODE_WORLD_WRITEABLE كل التطبيقات تستطيع الكتابة والتعديل في ملف الـ xml

وفي حالة وجود أكثر من ملف xml خاص بالتفضيلات يتم استخدام ميثود getSharedPreferences التي يتم اعطاؤها متغيرين هما اسم الملف وأسلوب العملية.

بعد إنشاء كائن-object من كلاس الـ SharedPreferences بنحتاج إنشاء كائن من كلاس Editor لكتابة أزواج من key/value إلي ملف الـ xml باستخدام ميثود put وفي النهاية استخدام ميثود commit لحفظ هذه البيانات ، وهناك خمسة أنواع محددة من البيانات الأساسية التي يمكن تخزينها وهي int, long, float, String & Boolean وهذا الكود يوضح كيفية إنشاء وتخزين بيانات بالـ SharedPreferences

SharedPreferences prefs = getSharedPreferences("myDataStorage", MODE_PRIVATE);
Editor mEditor = prefs.edit();
mEditor.putString("username","datastorageuser1");
mEditor.putString("password","password1234");
mEditor.commit();

وهذ الكود لتوضيح طريقة استرجاع هذه البيانات

SharedPreferences prefs = getSharedPreferences("myDataStorage", MODE_PRIVATE);
String username = prefs.getString("username", "");
String password = prefs.getString("password", "");

تطبيق بسيط :

في هذ التطبيق سنعطي للمستخدم خيار يسمح له بتحديد حجم خط معين للنص الذي يكتبه ، لذلك سنقوم بحفظ النص وحجم الخط المحدد من المستخدم ليستطيع التطبيق تذكره عند استخدام التطبيق مره آخري والخطوات كالآتي :

1- نفتح برنامج eclipse ونقوم بعمل مشروع جديد وليكن باسم SharedPreferences

2- نقوم بإضافة هذه السطور إلي ملف الـ main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
 
<SeekBar
android:id="@+id/SeekBar01"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
 
<TextView
android:id="@+id/TextView01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/welcome" />
 
<EditText
android:id="@+id/EditText01"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
 
<Button
android:id="@+id/btnSave"
android:text="Save"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
 
</LinearLayout>

ولا تنسوا عمل قيمه باسم welcome في ملف المصادر

3- نقوم بإضافة هذه السطور إلي ملف الأكتفيتي الرئيسي SharedPreferencesActivity

package com.androidhas.SharedPreferences;
 
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Toast;
 
public class SharedPreferencesActivity extends Activity {
 
private SharedPreferences prefs;
private String prefName = "MyPref";
private EditText editText;
private SeekBar seekBar;
private Button btn;
 
private static final String FONT_SIZE_KEY = "fontsize";
private static final String TEXT_VALUE_KEY = "textvalue";
 
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
 
editText = (EditText) findViewById(R.id.EditText01);
seekBar = (SeekBar) findViewById(R.id.SeekBar01);
btn = (Button) findViewById(R.id.btnSave);
 
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
 
//---get the SharedPreferences object---
prefs = getSharedPreferences(prefName, MODE_PRIVATE);
prefs = getPreferences(MODE_PRIVATE);
 
SharedPreferences.Editor editor = prefs.edit();
 
//---save the values in the EditText view to preferences---
editor.putFloat(FONT_SIZE_KEY, editText.getTextSize());
editor.putString(TEXT_VALUE_KEY, editText.getText().toString());
 
//---saves the values---
editor.commit(); 
 
//---display file saved message---
Toast.makeText(getBaseContext(),
"Font size saved successfully!",
Toast.LENGTH_SHORT).show();
}
}); 
 
//---load the SharedPreferences object---
SharedPreferences prefs = getSharedPreferences(prefName, MODE_PRIVATE);
prefs = getPreferences(MODE_PRIVATE);
 
//---set the TextView font size to the previously saved values---
float fontSize = prefs.getFloat(FONT_SIZE_KEY, 12);
 
//---init the SeekBar and EditText---
seekBar.setProgress((int) fontSize);
editText.setText(prefs.getString(TEXT_VALUE_KEY, ""));
editText.setTextSize(seekBar.getProgress());
 
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
 
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
 
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
//---change the font size of the EditText---
editText.setTextSize(progress);
}
});
 
}
}

4- نقوم بتشغيل التطبيق ليظهر لنا كما بهذه الصوره

ثم نضغط علي زر save ونجرب الخروج من التطبيق والعودة مره أخري لنجده كما تركناه.

ثانيا : قواعد البيانات :

نستخدمها لتخزين بيانات أكثر تعقيدا وبينها علاقات لأنها في هذه الحالة تكون أكثر كفاءة ، علي سبيل المثال تخزين نتائج امتحانات الطلاب في مدرسة ما ، والأندرويد بيوفر لنا دعم كامل لقواعد البيانات SQLite وقواعد البيانات التي يتم إنشاؤها تكون متاحة لأي كلاس بداخل نفس التطبيق فقط.

وأفضل طريقة لعمل قاعدة بيانات جديدة هي إنشاء كلاس ابن من كلاس SQLiteOpenHelper وعمل override لميثود onCreate وتنفيذ بها أوامر الـ SQLite مثل عمل querying للحصول علي نتيجة طالب معين.

وللتحدث عن قواعد البيانات بالتفصيل مع إعطاء أمثلة فنحن نحتاج إلي درس كامل لذلك قد نفرد لها درس قادم إن شاء الله تعالي.

المسؤول الأول عن قسم استكشف اندرويد في موقع أندرويدهـاز و صاحب سلسلة تعلم أندرويد وطالب في كلية الهندسة جامعة الأزهر بالقاهره، مهتم بالتكنولوجيا وأعشق تجربة كل جديد من منتجاتها.. http://androidhas.com/