اليوم سنتطلع على تخزين البيانات الداخلي في نظام الأندرويد. يقدم الأندرويد بعض الطرق المنظمة لتخزين البيانات. وتشمل ذلك
- تفضيلات المشاركة
- التخزين الداخلي
- التخزين الخارجي
- تخزين SQLite
- التخزين عبر اتصال الشبكة (على السحابة)
في هذا البرنامج التعليمي، سنتناول حفظ البيانات في ملفات وقراءتها باستخدام التخزين الداخلي في نظام الأندرويد.
التخزين الداخلي في نظام الأندرويد
التخزين الداخلي في نظام الأندرويد هو تخزين البيانات الخاصة في ذاكرة الجهاز. عندما تحفظ وتحمل الملفات في التخزين الداخلي، فإن ذلك سيكون خاصًا بالتطبيق ولن يكون لتطبيقات أخرى الوصول إلى هذه الملفات. عندما يقوم المستخدم بإلغاء تثبيت التطبيقات، يتم أيضًا إزالة الملفات المخزنة داخليًا والمرتبطة بالتطبيق. ومع ذلك، يجب ملاحظة أن بعض المستخدمين يقومون بعمل روتلهواتفهم الأندرويد، وبالتالي يحصلون على صلاحيات مستخدم رئيسية، وهؤلاء المستخدمين سيكون بإمكانهم قراءة وكتابة أي ملفات يرغبون فيها.
قراءة وكتابة ملف نصي في تخزين Android الداخلي
تقدم Android openFileInput
و openFileOutput
من فئات Java I/O لتعديل تيارات القراءة والكتابة من وإلى الملفات المحلية.
-
openFileOutput(): يُستخدم هذا الأسلوب لإنشاء وحفظ ملف. يتم توضيح بناء الجملة له فيما يلي:
FileOutputStream fOut = openFileOutput("اسم الملف",Context.MODE_PRIVATE);
يُرجع الأسلوب
openFileOutput()
مثيلًا منFileOutputStream
. بعد ذلك يمكننا استدعاء طريقة الكتابة لكتابة البيانات على الملف. يتم توضيح بناء الجملة له فيما يلي:String str = "بيانات الاختبار"; fOut.write(str.getBytes()); fOut.close();
-
openFileInput(): تُستخدم هذه الطريقة لفتح ملف وقراءته. تُرجع مثيلًا لـ FileInputStream. يتم توضيح بناء جملتها أدناه:
FileInputStream fin = openFileInput(file);
بعد ذلك، نقوم باستدعاء طريقة القراءة لقراءة حرف واحد في كل مرة من الملف ومن ثم طباعته. يتم توضيح بناء جملتها أدناه:
int c; String temp=""; while( (c = fin.read()) != -1){ temp = temp + Character.toString((char)c); } fin.close();
في الكود أعلاه، يحتوي السلسلة temp على جميع بيانات الملف.
-
يرجى ملاحظة أن هذه الطرق لا تقبل مسارات الملفات (على سبيل المثال، path/to/file.txt)، بل تأخذ فقط أسماء ملفات بسيطة.
بنية مشروع التخزين الداخلي في Android
شيفرة مثال لتخزين البيانات داخل تطبيق Android
تحتوي تخطيط XML على عنصر EditText
لكتابة البيانات إلى الملف، وزرين للكتابة والقراءة. يرجى مراعاة أن طرق onClick
معرفة في الملف XML كما هو موضح أدناه: activity_main.xml
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:padding="5dp"
android:text="Android Read and Write Text from/to a File"
android:textStyle="bold"
android:textSize="28sp" />
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/textView1"
android:layout_marginTop="22dp"
android:minLines="5"
android:layout_margin="5dp">
<requestFocus />
</EditText>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Write Text into File"
android:onClick="WriteBtn"
android:layout_alignTop="@+id/button2"
android:layout_alignRight="@+id/editText1"
android:layout_alignEnd="@+id/editText1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Read Text From file"
android:onClick="ReadBtn"
android:layout_centerVertical="true"
android:layout_alignLeft="@+id/editText1"
android:layout_alignStart="@+id/editText1" />
</RelativeLayout>
تحتوي الفصل MainActivity
على تنفيذ الكتابة والقراءة من الملفات كما شُرح أعلاه.
package com.journaldev.internalstorage;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class MainActivity extends Activity {
EditText textmsg;
static final int READ_BLOCK_SIZE = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textmsg=(EditText)findViewById(R.id.editText1);
}
// كتابة نص إلى ملف
public void WriteBtn(View v) {
// إضافة وكتابة النص إلى الملف
try {
FileOutputStream fileout=openFileOutput("mytextfile.txt", MODE_PRIVATE);
OutputStreamWriter outputWriter=new OutputStreamWriter(fileout);
outputWriter.write(textmsg.getText().toString());
outputWriter.close();
// عرض رسالة حفظ الملف
Toast.makeText(getBaseContext(), "File saved successfully!",
Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
// قراءة النص من الملف
public void ReadBtn(View v) {
// قراءة النص من الملف
try {
FileInputStream fileIn=openFileInput("mytextfile.txt");
InputStreamReader InputRead= new InputStreamReader(fileIn);
char[] inputBuffer= new char[READ_BLOCK_SIZE];
String s="";
int charRead;
while ((charRead=InputRead.read(inputBuffer))>0) {
// تحويل char إلى string
String readstring=String.copyValueOf(inputBuffer,0,charRead);
s +=readstring;
}
InputRead.close();
textmsg.setText(s);
} catch (Exception e) {
e.printStackTrace();
}
}
}
هنا، يظهر إعلان عندما يتم كتابة البيانات بنجاح في التخزين الداخلي، ويتم عرض البيانات في الـ EditText نفسه عند قراءة البيانات من الملف. الصورة أدناه توضح نتيجة المشروع، حيث تظهر كتابة النصوص إلى التخزين الداخلي وعند النقر على زر “قراءة”، يتم عرض النص مرة أخرى في نفس الـ EditText.
أين يوجد الملف؟
لعرض الملف بالفعل، افتح مراقب جهاز Android من الأدوات -> Android -> مراقب جهاز Android. يتواجد الملف في المجلد data -> data -> {اسم الحزمة} -> ملفات كما هو موضح في الصور أدناه: الملف “mytextfile.txt” يوجد في اسم الحزمة للمشروع أي com.journaldev.internalstorage كما هو موضح أدناه:
قم بتنزيل المشروع النهائي لمثال تخزين Android الداخلي من الرابط أدناه.
Source:
https://www.digitalocean.com/community/tutorials/android-internal-storage-example-tutorial