دیتابیس اندروید (SQlite Database) چیست و به چه دردی می خورد و کار کردن با آن (ایجاد، بروزرسانی، حذف) چگونه است؟در این مقاله می خواهیم با یک مثال کاربردی شما را با این مباحث آشنا کنیم با مرجع آموزش برنامه نویسی اندروید الکامکو همراه باشید.
هر برنامه یا اپلیکیشنی که ایجاد می شود یک سری داده هایی را نیز ایحاد می کند که این اطلاعات یا داده ها در جایی ذخیره هستند تا بتوان با این اطلاعات کار کرد. به این محل ذخیره سازی داده ها در اندروید پایگاه داده اندروید یا دیتابیس اندروید (Android Databasde) گفته می شود.
در واقع مجموعه ای از داده ها به صورت منظم در جدول دیتابیس در اندروید ذخیره می شوند و توسط مدیر پایگاه داده (DBMS) مدیریت (ایجاد، حذف و بروزرسانی) می شوند.
پایگاه داده SQLite یک ساختار پرس و جو (Query) مبتنی بر پایگاه داده، متن باز(Open Source) ، کم حجم، مستقل از شبکه است. هر زمان که یک برنامه نیاز به ذخیره مقدار زیادی از داده ها داشته باشد، استفاده از دیتابیس اندروید SQlite نسبت به سایر سیستم های ذخیره فایل مثل SharedPreferences یا ذخیره داده در فایل ها، ارجحیت بیشتری دارد.
اندروید در راستای اجرای بانک اطلاعاتی SQLite ساخته شده است و اطلاعات این بانک به صورت محلی از طریق دستگاه (تلفن همراه و رایانه لوحی) در دسترس است و حاوی داده هایی با فرمت متنی است. این دیتابیس اندروید دارای حجم کم و متناسب با بسیاری از زبان ها است. بنابراین نیازی به مدیریت یا تنظیم پایگاه داده ندارید.
نکته مهم: بانک اطلاعاتی ایجاد شده در یک فهرست راهنما ذخیره می شود
data / data / APP_Name / databases / DATABASE_NAME
ایجاد و بروزرسانی دیتابیس اندروید (Creating & Updating) :
برای ایجاد، بروزرسانی و سایر عملیات پایگاه داده اندروید باید یک کلاس فرعی یا کلاس SQLiteOpenHelper ایجاد کنید. SQLiteOpenHelper یک کلاس کمکی برای مدیریت ایجاد پایگاه داده و مدیریت آن است. این کلاس دو روش زیر را ارائه می دهد:
- onCreate (SQLiteDatabase db)
- onUpgrade (SQLiteDatabase db int oldVersion ، int newVersion)
کلاس SQLiteOpenHelper وظیفه باز کردن پایگاه داده را در صورت وجود داشتن بانک و ایجاد پایگاه داده را در صورت وجود نداشتن بانک بر عهده دارد و در صورت لزوم کار به روزرسانی را انجام می دهد.
کلاس SQLiteOpenHelper برای ایجاد بانک اطلاعاتی، تنها نیاز به یک نام نیاز دارد. پس از گسترش SQLiteOpenHelper ، شما باید روشهای آن را روی ایجاد ، onUpgrade و onCreate پیاده سازی و اجرا کنید.
روش (onCreate(SQLiteDatabase sqLiteDatabase فقط یک بار در طول چرخه برنامه (اپلیکشن) فراخوانی می شود. هر زمان که اولین تماس برای دریافت تابع () getReadableDatabase یا () getWritableDatabase موجود در سوپر کلاس SQLiteOpenHelper وجود داشته باشد، فراخوانی می شود. بنابراین کلاس SQLiteOpenHelper پس از ایجاد بانک اطلاعاتی و شیء SQLiteDatabase ، متد () onCreate را فراخوانی می کند.
روش (onUpgrade (SQLiteDatabase db، int oldVersion، int newVersion فقط در زمان بروزرسانی ها در نسخه موجود فراخوانی می شود. بنابراین برای بروزرسانی یک نسخه باید مقدار متغیر نسخه منتقل شده در superclass constructor را افزایش دهیم.
با روش onUpgrade می توانیم پرس و جو ها را برای انجام هر عملی که مورد نیاز باشد، نمایش دهید. در این مثال خواهید دید که جدول (های) موجود در حال حذف شدن هستند و با روش ()onCreate دوباره فراخوانی می شود تا جدول ها دوباره ایجاد شوند. اما انجام این کار اجباری نیست و همه چیز به نیاز شما بستگی دارد.
اگر ردیف جدیدی را در جدول دیتابیس اضافه کرده اید، باید نسخه بانک اطلاعاتی را تغییر دهید. اگر نیاز دارید تا داده های موجود را در جدول از دست ندهید، می توانید پرس و جو جدول را در روش onUpgrade (SQLiteDatabase db ، int oldVersion ، int newVersion) بنویسید.
مثالی از کار با دیتابیس اندروید SQlite در اندروید استودیو :
در این مثال ما می خواهیم عملکردهای اضافه کردن، بروزرسانی، حذف و عملکردهای بیشتر SQLite را روی جدولی در اندروید استودیو (Android Studio) نشان دهیم. پس یک فعالیت یا اکتیویتی ایجاد می کنیم که شامل متن ، دکمه و ویرایشگر متن باشد یعنی این اشیاء را در اکتیویتی درج می کنیم.
در کلاس دیگری که گسترش دهنده SQLiteOpenHelper است عملیات ایجاد و درج انجام شود. این مثال شامل اعتبارسنجی مناسب مانند نیاز به وارد کردن داده ها قبل از اجرای هر عملی است.
با کلیک روی دکمه زیر می توانید کد نوشته شده را دانلود کنید و نتیجه کار را نیز ببینید :
- مرحله اول: یک پروژه جدید به نام SQLiteOperations ایجاد کنید.
- مرحله دوم: مسیر زیر را دنبال کنید و کد زیر را به آن اضافه کنید:
res -> layout -> activity_main.xml (or) main.xml
در این مرحله یک طرح در فایل XML ایجاد می کنیم که جعبه متن (textbox)، دکمه هایی (buttons)، ویرایشگر متن (edittext) را اضافه می کند و این کدها روی دکمه onclick تعریف شده است که آن را با عملکرد مرتبط می کند.
<?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>
- مرحله سوم: مسیر app -> 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(""); } } } }
- مرحله چهارم: در این مرحله یک کلاس جاوا به نام myDbAdapter. java. بسازید.
در اینجا توابع استفاده شده برای انجام عملیات درج ، به روزرسانی و حذف عملیات را در 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); } } } }
- مرحله پنجم: در این مرحله کلاس جاوای دیگری به نام Message.class ایجاد کنید.
در این مرحله با استفاده از دستور toast پیغام ها را نمایش دهید:
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(); } }
مرحله ششم: خروجی برنامه :
اکنون برنامه را اجرا کرده و عملکردی که در دکمه ها اضافه شده است را مشاهده کنید.