آموزش SQLite Database (پایگاه داده ) در اندروید
اکثر برنامه های آندروید به منظور ذخیره اطلاعات کاربران خود نیاز به ایجاد دیتابیس یا پایگاه داده دارند . علی رغم اینکه راه های مختلفی برای ذخیره داده های کاربر وجود دارد، اما پایگاه های SQLite یک روش بسیار راحت و سریع برای ذخیره اطلاعات (و یا برنامه) داده ها و اطلاعات است.
SQLite روشی مبتنی بر openSource است که داده ها را به عنوان یک فایل متنی در یک دستگاه ذخیره می کند. آشنایی کلی با SQL، برنامه نویس را در ذخیره سازی اطلاعات و مدیریت مطلوب برنامه ها یاری می کند از این رو توسعه دهندگانی که با SQL آشنا نیستند، نباید بخاطر این موضوع دلسرد شوند بلکه یادگیری SQLLite، بسیار ساده و راحت است . SQLite یک سیستم مدیریت پایگاه داده ارتباطی همانند مانند Oracle، MySQL و PostgreSQL است که با توجه به سهولت ایجاد و دسترسی به آن ، احتمالا گسترده ترین موتور پایگاه داده در جهان محسوب می شود و می توان آن را در انواع نرم افزار ها و در سیستم های متنوع پیاده سازی کرده و در انواع مرورگرها و سیستم عامل ها یافت.
SQLite در اندروید دارای مکانیزمی برای ذخیره سازی اطلاعات است که در آن فایل های پایگاه داده در فضای دیسک خصوصی ذخیره می شود که برای سایر برنامه ها غیر قابل دسترسی است. به این ترتیب، هیچ نرم افزاری نمی تواند به داده های برنامه دیگری دسترسی پیدا کند.
به منظور درک بهتر موضوع ابتدا مثالی برای دوستان عزیز ارایه می کنیم و سپس به توضیح سورس ها خواهیم پرداخت:
اگر در داخل برنامه اکلیپس یا اندروید استودیو قرار دارید پروژه جدیدی را ایجاد کنید
اکلیپس :File ⇒ New Android ⇒ Application Project
اندروید استودیو :File ⇒ New ⇒ New Project
اما اگر هنوز برنامه خود را باز نکرده اید یکی از برنامه های فوق را باز نموده و بعد از تعیین مشخصات(نامگذاری) ، تعیین حداقل sdk و نوع اکتیویتی (blank یا Empty) ، نام اکتیویتی ابتدایی و اصلی خود را همان MainActivity قرار دهید.
بعد از لود کامل برنامه ،قبل از هر چیز کلاسی بنام Contact ایجاد کنید تا طریق روش های Getter و Setter بتوانیم به آبجکتی از آن دسترسی پیدا کنیم بعبارت دیگر این کلاس نوعی مدل است که دربرگیرنده داده هایی است که آنها را در پایگاه داده ذخیره کرده و در رابط کاربری آنها را نشان می دهیم.
package psrd.ir.example.SQLlite public class Contact { //تعریف متغیرها int _id; String _national_number; String _student_number; // public Contact(){ } // کلاس سازنده public Contact(int id, String national_number, String _student_number){ this._id = id; this._national_number = national_number; this._student_number = _student_number; } // رفتن به آیدی public int getID(){ return this._id; } // ست کردن آیدی public void setID(int id){ this._id = id; } // getting national_number public String getnational_number(){ return this._national_number; } // setting national_number public void setnational_number(String name){ this._national_number = name; } // getting student_number public String getstudent_number(){ return this._student_number; } // setting student_number public void setstudent_number(String student_number){ this._student_number = student_number; } }
به دنبال ایجاد کلاس Contactما باید کلاس جدید خودمان را برای هندل کردن تمامی عملیات های CRUD پایگاه داده (ایجاد، خواندن، به روز رسانی و حذف) ایجاد کنیم به همین منظور کلاس جدیدی با نام DatabaseHandler را ایجاد می کنیم و آن را به نوع SQLiteOpenHelper گسترش می دهیم . بعد از گسترش کلاس به نوع SQLiteOpenHelper لازم است که متدهای کلاس ذکر شده را پیاده سازی کنیم متدهای کلاس فوق بصورت زیر می باشد :
@Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
حالا ما باید روش هایی را برای مدیریت پایگاه داده ایجاد کنیم که بتوانیم عملیات خواندن و نوشتن را انجام دهیم. در اینجا ما روش های زیر را برای جدول student اجرا می کنیم.
// اضافه کردن اطلاعات به جدول public void addContact(Contact contact) {} // دسترسی به هریک از واحدهای جدول public Contact getContact(int id) {} // دسترسی به همه اطلاعات جدول public List<Contact> getAllContacts() {} // دسترسی به تعداد اطلاعات وارد شده به جدول public int getContactsCount() {} // آپدیت هریک از واحدهای جدول public int updateContact(Contact contact) {} // حذف هریک از واحدهای جدول public void deleteContact(Contact contact) {}
ذخیره اطلاعات در دیتابیس:
لازم است که متدی را تعریف کنیم که اطلاعات لازم را گرفته و در دیتابیس ذخیره کند از این رو متد addContact () را بعنوای متدی که اطلاعات را دیتابیس ذخیره می کند تعریف می کنیم.
public void addContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_NATIONAL_NUMBER, contact.getnational_number()); values.put(KEY_STUDENT_NUMBER, contact.getstudent_number()); // جایگزینی در جدول db.insert(TABLE_CONTACTS, null, values); db.close(); // Closing database connection }
فراخوانی اطلاعات از دیتابیس:
متد getContact () یک ردیف واحد از دیتابیس را می خواند. این متد پارامتری را به عنوان شناسه دریافت می کند و آن را از پایگاه داده فراخوانی می کند:
public Contact getContact(int id) { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID, KEY_NATIONAL_NUMBER, KEY_STUDENT_NUMBER }, KEY_ID + "=?", new String[] { String.valueOf(id) }, null, null, null, null); if (cursor != null) cursor.moveToFirst(); Contact contact = new Contact(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2)); return contact; }
متد () getAllContacts در این مثال تمام اطلاعات را از پایگاه داده در قالب لیست آرایه از نوع Contact type باز می کند.
public List<Contact> getAllContacts() { List<Contact> contactList = new ArrayList<Contact>(); // Select All Query String selectQuery = "SELECT * FROM " + TABLE_CONTACTS; SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); // looping through all rows and adding to list if (cursor.moveToFirst()) { do { Contact contact = new Contact(); contact.setID(Integer.parseInt(cursor.getString(0))); contact.setnational_number(cursor.getString(1)); contact.setstudent_number(cursor.getString(2)); // Adding contact to list contactList.add(contact); } while (cursor.moveToNext()); } // return contact list return contactList; }
در این مثال متد ()updateContact یک داده واحد را در پایگاه داده آپدیت می کند.
public int updateContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_NATIONAL_NUMBER, contact.getnational_number()); values.put(KEY_STUDENT_NUMBER, contact.getstudent_number()); // updating row return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?", new String[] { String.valueOf(contact.getID()) }); }
در این مثال متد ()deleteContact یک داده واحد را از پایگاه داده حذف می کند.
public void deleteContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_CONTACTS, KEY_ID + " = ?", new String[] { String.valueOf(contact.getID()) }); db.close(); }
کدهای کامل کلاس DatabaseHandler بصورت زیر می باشد:
package psrd.ir.example.SQLlite; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import java.util.ArrayList; import java.util.List; /** * Created by h.ghanbari on 23/12/2017. */ public class DatabaseHandler extends SQLiteOpenHelper { // متغیرهای استاتیک // ورژن دیتابیس private static final int DATABASE_VERSION = 1; // نام دیتابیس private static final String DATABASE_NAME = "student_Manager"; // نام جدول دیتابیس private static final String TABLE_CONTACTS = "student"; // ستون های جدول دیتابیس و نام آنها private static final String KEY_ID = "id"; private static final String KEY_NATIONAL_NUMBER = "national_number"; private static final String KEY_STUDENT_NUMBER = "student_number"; public DatabaseHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } // ایجاد جدول در دیتابیس @Override public void onCreate(SQLiteDatabase db) { String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NATIONAL_NUMBER + " TEXT," + KEY_STUDENT_NUMBER + " TEXT" + ")"; db.execSQL(CREATE_CONTACTS_TABLE); } // Upgrading دیتابیس @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // پاک کردن جدول در صورت وجود آن db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS); // Create tables again onCreate(db); } public void addContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_NATIONAL_NUMBER, contact.getnational_number()); values.put(KEY_STUDENT_NUMBER, contact.getstudent_number()); // جایگزینی در جدول db.insert(TABLE_CONTACTS, null, values); db.close(); // Closing database connection } public Contact getContact(int id) { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID, KEY_NATIONAL_NUMBER, KEY_STUDENT_NUMBER }, KEY_ID + "=?", new String[] { String.valueOf(id) }, null, null, null, null); if (cursor != null) cursor.moveToFirst(); Contact contact = new Contact(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2)); return contact; } public List<Contact> getAllContacts() { List<Contact> contactList = new ArrayList<Contact>(); // Select All Query String selectQuery = "SELECT * FROM " + TABLE_CONTACTS; SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); // looping through all rows and adding to list if (cursor.moveToFirst()) { do { Contact contact = new Contact(); contact.setID(Integer.parseInt(cursor.getString(0))); contact.setnational_number(cursor.getString(1)); contact.setstudent_number(cursor.getString(2)); // Adding contact to list contactList.add(contact); } while (cursor.moveToNext()); } // return contact list return contactList; } public int updateContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_NATIONAL_NUMBER, contact.getnational_number()); values.put(KEY_STUDENT_NUMBER, contact.getstudent_number()); // updating row return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?", new String[] { String.valueOf(contact.getID()) }); } public void deleteContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_CONTACTS, KEY_ID + " = ?", new String[] { String.valueOf(contact.getID()) }); db.close(); } }
به منظور اجرای عملیات های مربوط به دیتابیس SQLLite می توانیم در اکتیویتی ها خود کدهای زیر را قرار می دهیم:
package psrd.ir.example.SQLlite; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.Toast; import java.util.List; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity); DatabaseHandler db = new DatabaseHandler(this); /** * CRUD Operations * */ // جایگزینی اطلاعات db.addContact(new Contact("1552154545", "9865321456")); List<Contact> contacts = db.getAllContacts(); for (Contact cn : contacts) { String log = "Id: "+cn.getID()+" ,شماره ملی: " + cn.getnational_number() + " ,شماره دانشجویی: " + cn.getstudent_number(); // Writing Contacts to log Toast.makeText(getApplicationContext(),log.toString(),Toast.LENGTH_LONG).show(); } } }
حال می توانید پروژه خود را اجرا کنید و نتیجه کار خود را ببینید.
0 دیدگاه