برنامج تعليمي SQLite مع مثال في Android Studio
SQLite هي قاعدة بيانات قاعدة استعلام هيكل ، مفتوحة المصدر ، خفيفة الوزن ، لا يوجد وصول إلى الشبكة وقاعدة بيانات قائمة بذاتها. يدعم ميزات قاعدة البيانات العلائقية المضمنة.
عندما يحتاج أحد التطبيقات إلى تخزين كمية كبيرة من البيانات ، يكون استخدام sqlite أكثر تفضيلاً من نظام المستودعات الأخرى مثل SharedPreferences أو حفظ البيانات في الملفات.
قام Android ببناء تطبيق قاعدة بيانات SQLite. وهي متوفرة محليًا عبر الجهاز (الهاتف المحمول والكمبيوتر اللوحي) وتحتوي على بيانات بتنسيق نصي. تحمل بيانات خفيفة الوزن ومناسبة للعديد من اللغات. لذلك ، لا يتطلب أي إجراء إدارة أو إعداد لقاعدة البيانات.
ملاحظة مهمة - يتم حفظ قاعدة البيانات التي تم إنشاؤها في دليل: data / data / APP_Name / databases / DATABASE_NAME.
جدول المحتويات
إنشاء وتحديث قاعدة البيانات في Android
للإنشاء والتحديث والعمليات الأخرى ، تحتاج إلى إنشاء فئة فرعية أو فئة SQLiteOpenHelper . SQLiteOpenHelper هي فئة مساعدة لإدارة إنشاء قاعدة البيانات وإدارة الإصدار. يوفر طريقتين onCreate (SQLiteDatabase db) ، عند الترقية (SQLiteDatabase db ، int oldVersion ، int newVersion).
يعد SQLiteOpenHelper مسؤولاً عن فتح قاعدة البيانات إن وجدت وإنشاء قاعدة بيانات إذا لم تكن موجودة والترقية إذا لزم الأمر. لا يتطلب SQLiteOpenHelper سوى DATABASE_NAME لإنشاء قاعدة بيانات. بعد تمديد SQLiteOpenHelper ، ستحتاج إلى تنفيذ أساليبها onCreate و onUpgrade والمنشئ.
يتم استدعاء طريقة onCreate (SQLiteDatabase sqLiteDatabase) مرة واحدة فقط طوال دورة حياة التطبيق. سيتم استدعاؤه كلما كان هناك استدعاء أول لوظيفة getReadableDatabase () أو getWritableDatabase () المتوفرة في فئة Super SQLiteOpenHelper. لذلك تقوم فئة SQLiteOpenHelper باستدعاء طريقة onCreate () بعد إنشاء قاعدة بيانات وإنشاء كائن SQLiteDatabase. تم تمرير اسم قاعدة البيانات في استدعاء المُنشئ.
لا يتم استدعاء onUpgrade (SQLiteDatabase db ، int oldVersion ، int newVersion) فقط عندما يكون هناك تحديث في الإصدار الحالي. لذلك لتحديث إصدار ، يتعين علينا زيادة قيمة متغير الإصدار الذي تم تمريره في مُنشئ الطبقة الفائقة.
في طريقة onUpgrade يمكننا كتابة استعلامات لأداء أي إجراء مطلوب. في معظم الأمثلة ، سترى أنه يتم إسقاط الجدول (الجداول) الموجودة ومرة أخرى يتم استدعاء طريقة onCreate () لإنشاء الجداول مرة أخرى. لكن هذا ليس إلزاميًا وكل هذا يتوقف على متطلباتك.
يتعين علينا تغيير إصدار قاعدة البيانات إذا أضفنا صفًا جديدًا في جدول قاعدة البيانات. إذا كان لدينا متطلبات لا نريد فقدان البيانات الموجودة في الجدول ، فيمكننا كتابة استعلام جدول بديل في طريقة onUpgrade (SQLiteDatabase db ، int oldVersion ، int newVersion).
لمزيد من التفاصيل ، اقرأ: إدراج ، قراءة ، حذف وتحديث العملية في SQLite
مثال SQLite في Android Studio
احصل على فهم أفضل لـ Sqlite قبل قراءة المثال - للحصول على فهم أفضل لقاعدة بيانات SQlite ، يوصى بقراءة المقالة أدناه أولاً:
- مقدمة في SQLite والتثبيت
- قائمة بجميع المشغلين في SQLite
- نوع البيانات والأوامر في SQLite
- قائمة بجميع البنود في سكليتي لتعريف شرط معين
- إدراج العملية وقراءتها وحذفها وتحديثها في SQLite
في هذا المثال ، نريد ببساطة توضيح عمليات الإدراج والتحديث والحذف والمزيد من عمليات SQLite عبر جدول في Android Studi. أنشأنا نشاطًا يحتوي على عرض نص وزر وتحرير نص فوقه. فئة أخرى تقوم بتوسيع SQLiteOpenHelper حيث سيتم تنفيذ عمليات الإنشاء والإدراج. يحتوي المثال على التحقق المناسب مثل أنك تحتاج إلى إدخال البيانات قبل تنفيذ أي عملية.
يمكنك أدناه تنزيل الكود ، والاطلاع على الإخراج النهائي والشرح خطوة بخطوة:
الخطوة 1: إنشاء مشروع جديد وتسميته SQLiteOperations .
الخطوة 2: افتح res -> layout -> activity_main.xml (أو) main.xml وأضف الكود التالي:
في هذه الخطوة ، نقوم بإنشاء تخطيط في ملف XML الخاص بنا بإضافة مربع نص وأزرار وتحرير. يتم تعريف الزر عند النقر على الزر الذي يربطه بالوظيفة ذات الصلة.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" 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" tools:context="com.example.sqliteoperations.MainActivity" android:background="@android:color/holo_blue_dark"> <TextView android:text="@string/username" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="12dp" android:id="@+id/textView" android:textSize="18sp" android:textStyle="bold|italic" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:gravity="center" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPersonName" android:ems="10" android:id="@+id/editName" android:textStyle="bold|italic" android:layout_below="@+id/textView" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:hint="Enter Name" android:gravity="center_vertical|center" /> <TextView android:text="@string/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="13dp" android:id="@+id/textView2" android:textStyle="bold|italic" android:textSize="18sp" android:layout_below="@+id/editName" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:gravity="center" android:hint="Enter Password" /> <Button android:text="@string/view_data" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2" android:textSize="18sp" android:onClick="viewdata" android:textStyle="bold|italic" android:layout_alignBaseline="@+id/button" android:layout_alignBottom="@+id/button" android:layout_alignRight="@+id/button4" android:layout_alignEnd="@+id/button4" /> <Button android:text="@string/add_user" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button" android:textStyle="bold|italic" android:textSize="18sp" android:onClick="addUser" android:layout_marginLeft="28dp" android:layout_marginStart="28dp" android:layout_below="@+id/editPass" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="23dp" /> <Button android:text="@string/update" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button3" android:onClick="update" android:textStyle="normal|bold" android:layout_below="@+id/editText3" android:layout_alignLeft="@+id/button4" android:layout_alignStart="@+id/button4" android:layout_marginTop="13dp" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="textPersonName" android:ems="10" android:id="@+id/editText6" android:layout_alignTop="@+id/button4" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:freezesText="false" android:hint="Enter Name to Delete Data" android:layout_toLeftOf="@+id/button2" android:layout_toStartOf="@+id/button2" /> <Button android:text="@string/delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="21dp" android:layout_marginEnd="21dp" android:id="@+id/button4" android:onClick="delete" android:textStyle="normal|bold" tools:ignore="RelativeOverlap" android:layout_marginBottom="41dp" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="textPersonName" android:ems="10" android:layout_marginTop="47dp" android:id="@+id/editText3" android:textStyle="bold|italic" android:textSize="14sp" android:layout_below="@+id/button" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginLeft="7dp" android:layout_marginStart="7dp" android:hint="Current Name" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPassword" android:ems="10" android:layout_marginTop="11dp" android:id="@+id/editPass" android:hint="Enter Password" android:gravity="center_vertical|center" android:textSize="18sp" android:layout_below="@+id/textView2" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:textAllCaps="false" android:textStyle="normal|bold" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="textPersonName" android:ems="10" android:id="@+id/editText5" android:textStyle="bold|italic" android:textSize="14sp" android:hint="New Name" android:layout_alignTop="@+id/button3" android:layout_alignLeft="@+id/editText3" android:layout_alignStart="@+id/editText3" android:layout_marginTop="32dp" /> </RelativeLayout>
الخطوة 3: الآن افتح التطبيق -> java -> package -> MainActivity.java وأضف الكود أدناه.
في هذه الخطوة ، استخدمنا الوظائف المرتبطة عبر النقر فوق الزر. يتم تعريف هذه الوظائف في فئة أخرى ويتم استخدامها هنا. كل دالة ترجع قيمة تحدد عدد الصفوف التي تم تحديثها ، باستخدام ذلك قمنا بتحديد ما إذا كانت العملية ناجحة أم لا. يحتاج المستخدم أيضًا إلى تحديد بيانات صالحة لإجراء العملية لن يتم الترفيه عن الحقول الفارغة وإرجاع الخطأ.
package com.example.sqliteoperations; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class MainActivity extends AppCompatActivity { EditText Name, Pass , updateold, updatenew, delete; myDbAdapter helper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Name= (EditText) findViewById(R.id.editName); Pass= (EditText) findViewById(R.id.editPass); updateold= (EditText) findViewById(R.id.editText3); updatenew= (EditText) findViewById(R.id.editText5); delete = (EditText) findViewById(R.id.editText6); helper = new myDbAdapter(this); } public void addUser(View view) { String t1 = Name.getText().toString(); String t2 = Pass.getText().toString(); if(t1.isEmpty() || t2.isEmpty()) { Message.message(getApplicationContext(),"Enter Both Name and Password"); } else { long id = helper.insertData(t1,t2); if(id<=0) { Message.message(getApplicationContext(),"Insertion Unsuccessful"); Name.setText(""); Pass.setText(""); } else { Message.message(getApplicationContext(),"Insertion Successful"); Name.setText(""); Pass.setText(""); } } } public void viewdata(View view) { String data = helper.getData(); Message.message(this,data); } public void update( View view) { String u1 = updateold.getText().toString(); String u2 = updatenew.getText().toString(); if(u1.isEmpty() || u2.isEmpty()) { Message.message(getApplicationContext(),"Enter Data"); } else { int a= helper.updateName( u1, u2); if(a<=0) { Message.message(getApplicationContext(),"Unsuccessful"); updateold.setText(""); updatenew.setText(""); } else { Message.message(getApplicationContext(),"Updated"); updateold.setText(""); updatenew.setText(""); } } } public void delete( View view) { String uname = delete.getText().toString(); if(uname.isEmpty()) { Message.message(getApplicationContext(),"Enter Data"); } else{ int a= helper.delete(uname); if(a<=0) { Message.message(getApplicationContext(),"Unsuccessful"); delete.setText(""); } else { Message.message(this, "DELETED"); delete.setText(""); } } } }
الخطوة 4: في هذه الخطوة ، قم بإنشاء فئة java myDbAdapter. جافا.
في هذا نحدد الوظائف التي يتم استخدامها لأداء عمليات إدراج وتحديث وحذف العمليات في SQLite. علاوة على ذلك ، تنشئ هذه الفئة فئة أخرى من شأنها توسيع SQLiteOpenHelper. كل دالة لها طرق مكافئة تؤدي العمليات.
ملاحظة مهمة - وفقًا لاصطلاح التسمية ، يُقترح تحديد المفتاح الأساسي بدءًا من مثال الشرطة السفلية: _id.
package com.example.sqliteoperations; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class myDbAdapter { myDbHelper myhelper; public myDbAdapter(Context context) { myhelper = new myDbHelper(context); } public long insertData(String name, String pass) { SQLiteDatabase dbb = myhelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(myDbHelper.NAME, name); contentValues.put(myDbHelper.MyPASSWORD, pass); long id = dbb.insert(myDbHelper.TABLE_NAME, null , contentValues); return id; } public String getData() { SQLiteDatabase db = myhelper.getWritableDatabase(); String[] columns = {myDbHelper.UID,myDbHelper.NAME,myDbHelper.MyPASSWORD}; Cursor cursor =db.query(myDbHelper.TABLE_NAME,columns,null,null,null,null,null); StringBuffer buffer= new StringBuffer(); while (cursor.moveToNext()) { int cid =cursor.getInt(cursor.getColumnIndex(myDbHelper.UID)); String name =cursor.getString(cursor.getColumnIndex(myDbHelper.NAME)); String password =cursor.getString(cursor.getColumnIndex(myDbHelper.MyPASSWORD)); buffer.append(cid+ " " + name + " " + password +" \n"); } return buffer.toString(); } public int delete(String uname) { SQLiteDatabase db = myhelper.getWritableDatabase(); String[] whereArgs ={uname}; int count =db.delete(myDbHelper.TABLE_NAME ,myDbHelper.NAME+" = ?",whereArgs); return count; } public int updateName(String oldName , String newName) { SQLiteDatabase db = myhelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(myDbHelper.NAME,newName); String[] whereArgs= {oldName}; int count =db.update(myDbHelper.TABLE_NAME,contentValues, myDbHelper.NAME+" = ?",whereArgs ); return count; } static class myDbHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "myDatabase"; // Database Name private static final String TABLE_NAME = "myTable"; // Table Name private static final int DATABASE_Version = 1;. // Database Version private static final String UID="_id"; // Column I (Primary Key) private static final String NAME = "Name"; //Column II private static final String MyPASSWORD= "Password"; // Column III private static final String CREATE_TABLE = "CREATE TABLE "+TABLE_NAME+ " ("+UID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+NAME+" VARCHAR(255) ,"+ MyPASSWORD+" VARCHAR(225));"; private static final String DROP_TABLE ="DROP TABLE IF EXISTS "+TABLE_NAME; private Context context; public myDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_Version); this.context=context; } public void onCreate(SQLiteDatabase db) { try { db.execSQL(CREATE_TABLE); } catch (Exception e) { Message.message(context,""+e); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { try { Message.message(context,"OnUpgrade"); db.execSQL(DROP_TABLE); onCreate(db); }catch (Exception e) { Message.message(context,""+e); } } } }
الخطوة 5: في هذه الخطوة ، قم بإنشاء فئة Java أخرى Message.class
في هذا مجرد إضافة نخب لعرض الرسالة. هذا اختياري ، تمت إضافته مرارًا وتكرارًا لتحديد الخبز المحمص في المثال.
package com.example.sqliteoperations; import android.content.Context; import android.widget.Toast; public class Message { public static void message(Context context, String message) { Toast.makeText(context, message, Toast.LENGTH_LONG).show(); } }
الإخراج
الآن قم بتشغيل التطبيق وعرض الوظائف المضافة عبر الأزرار.
إضافة واسترداد الصورة من قاعدة بيانات SQLite
لفهم كيفية إضافة أو استرداد الصورة من وحدة التخزين الخارجية للهاتف إلى التطبيق باستخدام قاعدة بيانات SQLite. يرجى قراءة إضافة واسترداد الصورة خطوة بخطوة من البرنامج التعليمي SQLite .