آموزش 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 دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

-- بارگیری کد امنیتی --