تخفیف ویژه

دیتابیس در اندروید و مثالی کاربردی از SQLite

دسته بندی: برنامه نویسی
زمان مطالعه: 25 دقیقه
۱۴ شهریور ۱۳۹۹

شما برای دسترسی و استفاده از داده‌های خود در اندروید باید از دیتابیس در اندروید استفاده کنید. با استفاده از دیتابیس در اندروید می‌توانید به راحتی به هر داده‌ای که نیاز دارید دسترسی داشته باشید. برای مثال می‌توانید در تلفن همراه خود به مخاطبان و دفترچه تلفن دسترسی داشته و به هر اطلاعاتی که نیاز دارید دست پیدا کنید؛ این امکان را پایگاه داده یا دیتابیس در اندروید در اختیار شما قرار می‌دهد. در ادامه‌ی این مطلب با ما همراه باشید تا با دیتابیس در اندروید، خواندن اطلاعات از دیتابیس در اندروید و کار با آن آشنا شوید.

فهرست محتوای این مقاله

دیتا چیست؟

داده‌ها مجموعه‌ای از یک واحد کوچک و مشخص از اطلاعات هستند. دیتا می‌تواند به اشکال مختلفی مانند متن، اعداد، رسانه، بایت و ... استفاده شود و می‌تواند در قطعه‌ای کاغذ یا حافظه‌ی الکترونیکی و ... ذخیره شود. کلمه‌ی "Data" از کلمه‌‌ی "Datum" گرفته شده است که به معنای "اطلاعات واحد" است.

دیتابیس چیست؟

بانک اطلاعاتی مجموعه‌ای سازمان یافته از داده‌ها است که معمولاً از طریق سیستم رایانه‌ای به صورت الکترونیکی ذخیره می‌شود و قابل دسترسی است. در جایی که پایگاه داده‌ها پیچیده‌تر هستند، آن‌ها اغلب با استفاده از تکنیک‌های طراحی و مدل سازی توسعه می‌یابند. بر این اساس، یک دفترچه تلفن به نوعی دیتابیس یا پایگاه داده به حساب می‌آید.

برای کسب اطلاعات بیش‌تر توصیه می‌کنیم مقاله‌ی "پایگاه داده چیست؟" را مطالعه کنید.

پنج مورد از محبوب‌ترین بانک‌های اطلاعاتی برای برنامه‌های تلفن همراه

در این بخش ما با پنج مورد از محبوب‌ترین دیتابیس‌ها آشنا می‌شویم:
  1. SQLite
  2. Realm DB
  3. ORMLite
  4. Berkeley DB
  5. Couchbase Lite

SQLite

SQLite یک دیتابیس رابطه‌ای و نسخه‌ای سبک‌تر از SQL می‌باشد که برای موبایل طراحی شده است که با آن خواندن اطلاعات از دیتابیس در اندروید راحت شده است. SQLite از تمامی ویژگی‌های دیتابیس رابطه‌ای پشتیبانی می‌کند. SQLite یک کتابخانه‌‌ی فشرده و متن باز است که به طور پیش فرض در دو سیستم عامل اصلی موبایل یعنی Android و iOS موجود است، همچنین توسط تلفن‌های Blackberry و Windows نیز پشتیبانی می‌شود.

SQLite هم در دیسک و هم در حافظه می‌تواند ذخیره شود. در SQLite هر فایل بانک اطلاعاتی یک فایل دیسک واحد است؛ همچنین می‌توان از آن به صورت کراس پلتفرم استفاده کرد. SQLite بسیار سریع است و برای کار کردن به حافظه‌ی بسیار کم‌تری نیاز دارد.

Realm DB

Realm یک سیستم مدیریت پایگاه داده رابطه‌ای است. داده‌ها را می‌توان Query، فیلتر و به هم پیوسته کرد. Realm DB توسط Realm ساخته شده است و به ویژه برای اجرا روی دستگاه‌های تلفن همراه طراحی شده است.

Realm مانند SQLite، بدون سرور و کراس پلتفرم است. می‌توان آن را هم در دیسک و هم در حافظه ذخیره کرد.

ORMLite

ORMLite نسخه‌ی سبک‌تر از Object Relational Mapping است.

ORMLite می‌تواند برای ساده سازی عملیات پیچیده‌ی SQL از انعطاف پذیری Query builder استفاده کند. این کلاس همچنین دسترسی انتزاعی به (Database Access Object (DAO را فراهم می‌کند.

ORMLite در اپلیکیشن‌های بزرگ با Query پیچیده مفید است زیرا دستورات SQL را برای کوئری تسک‌های تکراری کامپایل می‌کند.

ORMLite از پیکربندی جداول و قسمت‌ها بدون حاشیه نویسی (Annotation) پشتیبانی کرده و همچنین از تماس‌های native با API‌های پایگاه داده SQLite در اندروید پشتیبانی می‌کند.

اما ORMLite تمامی الزامات را برآورده نمی‌کند، در مقایسه با SQLite یا Realm، کندتر از SQLite و Realm است، اما سریع‌تر از بسیاری از ORM‌های دیگر موجود در بازار می‌باشد. در کل ORMLite اگر از نظر کاربرد بزرگ و پیچیده باشد‌، جایگزینی مناسب برای SQLite است.

Barkeley DB

Berkeley DB یک دیتابیس با کارآیی بالا است که به ما امکان می‌دهد داده‌ها را به روش‌های مختلفی مدیریت کنیم. این نرم افزار توسط Sleepycat Software توسعه یافته اما توسط Oracle در سال 2006 خریداری شده است.

Berkeley DB می‌تواند داده‌ها را از جهات مختلف اداره کند. Berkeley می‌تواند به صورت رابطه‌ای مانند SQLite باشد (با جایگزین کردن SQLite با کتابخانه خود)، یا می‌تواند در داده‌های جفت Key / Value به عنوان آرایه‌های بایت باشد و از چندین داده برای یک کلید واحد پشتیبانی کند. همچنین از اشیاء جاوا به عنوان داده پشتیبانی می‌کند.

Berkeley می‌تواند به عنوان دیتابیس رابطه‌ای و همچنین NoSQL کار کند (بستگی به این دارد که از چه کتابخانه‌ای استفاده می‌کنید).

نکته‌ی خوب در مورد Berkeley DB این می‌باشد که API ارائه شده توسط آن با SQLite سازگار است. بنابراین می‌توان از Berkeley بدون بازنویسی مجدد کل کد استفاده کرد. ترکیبی از دیتابیس‌های Berkeley و SQLite از دیگر دیتابیس‌ها سریع‌تر بوده و در عملکردهای خواندن چندگانه، همزمان و منفرد بهتر عمل می‌کند.

Berkeley نسبتاً سریع‌تر از SQLite می‌باشد، اما به دلیل ویژگی‌های بسیار مختلف، حجیم‌تر از سایر دیتابیس‌های مطرح شده است. بنابراین اگر اندازه‌ی برنامه برای شما ملاک است، سعی کنید از دیتابیس دیگری استفاده کنید، مگر این که یک ویژگی خاص را بخواهید که منحصراً توسط Barkeley DB ارائه شده باشد.

Couchbase Lite

Couchbase Lite پایگاه داده‌ی JSON و NoSQL می‌باشد. Couchbase Lite یک دیتابیس بسیار مقیاس‌پذیر با امنیت بالا است. داده‌ها در Couchbase Lite به عنوان اسناد JSON ذخیره می‌شوند. هر سند می‌تواند دارای یک یا چند پیوست باشد که به طور جداگانه از دیگر اسناد ذخیره می‌شود.

Couchbase Mobile راهکاری است که توسط Couchbase Lite برای برنامه‌های موبایل ارائه شده است.

Couchbase Mobile از سه کامپوننت مختلف تشکیل شده است: Couchbase Lite، یک پایگاه داده تعبیه شده و Sync Gateway NoSQL.

Couchbase نوعی دیتابیس آفلاین است، هر زمان که شبکه در دسترس باشد، همگام سازی با Cloud لازم می‌شود.

Couchbase Lite به صورت محلی بر روی دستگاه اجرا می‌شود و داده‌ها با فرمت JSON و باینری هستند. تمام عملیات خام روی دیتابیس محلی انجام می‌شود. برای همگام سازی دیتابیس محلی با Cloud، توسعه دهنده نیازی به نوشتن کد همگام سازی (در صورت نیاز) ندارد، این کار توسط Sync Gateway انجام می‌شود.

یکی دیگر از مزیت‌های Couchbase Lite این است که API‌های Native را برای Android و iOS و افزونه‌های Xamarin و PhoneGap ارائه می‌دهد.

SQLite در اندروید

تا اینجا شما با دیتابیس در اندروید آشنا شدید. در بالا SQLite را توضیح دادیم و در این مقاله قصد داریم بیش‌تر به آن بپردازیم.

SQLiteOpenHelper

Android دارای ویژگی‌هایی است تا بتواند طرح‌های تغییر پایگاه داده را کنترل کند، که بیش‌تر به استفاده از کلاس SQLiteOpenHelper بستگی دارد.
SQLiteOpenHelper برای خلاص شدن از دو مشکل بسیار رایج طراحی شده است.

1- هنگامی که برنامه برای اولین بار اجرا می‌شود، در این مرحله، ما هنوز پایگاه داده نداریم. بنابراین ما مجبور خواهیم بود جداول، ایندکس‌ها، داده‌های اولیه و... را ایجاد کنیم.

2- هنگامی که برنامه به یک طرح جدیدتر ارتقا می‌یابد،  پایگاه داده‌ی ما همچنان از نسخه‌ی قدیمی برنامه در طرح قدیمی استفاده می‌کند.
همچنین گزینه‌ای برای تغییر برنامه‌ی بانک اطلاعاتی خواهید داشت تا با نیاز بقیه برنامه‌ها مطابقت داشته باشد.
SQLiteOpenHelper با استفاده از این منطق، پایگاه داده را مطابق مشخصات ما ایجاد و بروز می‌کند. برای این کار ما باید یک subclass سفارشی با استفاده از SQLiteOpenHelper به سه روش زیر را اجرا کنیم.
1. Constructor: شامل Context (به عنوان مثال، یک Activity)، نام بانک اطلاعاتی، یک cursor factory اختیاری و یک عدد صحیح که نمایانگر نسخه‌ی پایگاه داده‌ای است که شما استفاده می‌کنید.

public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

2. (onCreate (SQLiteDatabase db: وقتی پایگاه داده وجود نداشته باشد و برنامه به یک  دیتابیس نیاز داشته باشد، (onCreate (SQLiteDatabase db فراخوانی می‌شود.

با استفاده از پایگاه داده‌ی جدید ایجاد شده، یک شی SQLiteDatabase را فراخوانی می‌کنیم که می‌توان آن را با جداول و داده‌های اولیه جمع کرد.

3. (onUpgrade (SQLiteDatabase db، int oldVersion، int newVersion: اگر نسخه‌ی اسکیما (schema) مورد نیاز شما با نسخه‌ی اسکیما پایگاه داده مطابقت نداشته باشد، این تابع فراخوانی می‌شود. یک شیء SQLiteDatabase و شماره‌های نسخه‌ی قدیمی و جدید را به ما برمی‌گرداند. از این رو می‌توانیم بهترین روش برای تبدیل دیتابیس از طرح قدیمی به نسخه‌ی جدید را بفهمیم.

یک کلاس DBManager را برای انجام کلیه‌ی عملیات پایگاه داده CRUD (ایجاد، خواندن، به روزرسانی و حذف) تعریف می‌کنیم.

باز و بسته کردن اتصال پایگاه داده SQLite در اندروید

قبل از انجام هر گونه عملیات دیتابیس مانند اضافه کردن، بروزرسانی، حذف پرونده در یک جدول، ابتدا با فراخوانی متد ()getWritableDatabase همان‌طور که در زیر آمده است، اتصال بانک اطلاعاتی را باز کنید.

public DBManager open() throws SQLException {
        dbHelper = new DatabaseHelper(context);
        database = dbHelper.getWritableDatabase();
        return this;
    }

dbHelper نمونه‌ای از  SQLiteOpenHelper ،Subclass است.

برای بستن اتصال پایگاه داده، متد زیر فراخوانی می‌شود.


 public void close() {
        dbHelper.close();
    }

درج رکورد جدید در جدول پایگاه داده SQLite در اندروید

قطعه کد زیر نحوه‌ی درج یک رکورد جدید در پایگاه داده‌ی اندرویدی SQLite را نشان می‌دهد.


public void insert(String name, String desc) {
        ContentValues contentValue = new ContentValues();
        contentValue.put(DatabaseHelper.SUBJECT, name);
        contentValue.put(DatabaseHelper.DESC, desc);
        database.insert(DatabaseHelper.TABLE_NAME, null, contentValue);
    }

بروزرسانی رکورد در جدول پایگاه داده SQLite در اندروید

قطعه‌ کد زیر نحوه‌ی بروزرسانی یک رکورد واحد را نشان می‌دهد.


public int update(long _id, String name, String desc) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(DatabaseHelper.SUBJECT, name);
        contentValues.put(DatabaseHelper.DESC, desc);
        int i = database.update(DatabaseHelper.TABLE_NAME, contentValues, DatabaseHelper._ID + " = " + _id, null);
        return i;
    }

SQLite در اندروید - حذف یک رکورد

فقط باید شناسه رکورد را حذف کنیم تا حذف شود. همان‌طور که در زیر نشان داده شده است.

public void delete(long _id) {
        database.delete(DatabaseHelper.TABLE_NAME, DatabaseHelper._ID + "=" + _id, null);
    }

مثالی از ساختار پروژه SQLite در اندروید

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

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

در این برنامه می‌خواهیم پرونده‌هایی ایجاد کنیم که نام کشورها و ارزهای مربوطه را در قالب ListView ذخیره کند.

در این مثال می‌توانید خواندن اطلاعات از دیتابیس در اندروید، گرفتن اطلاعات از دیتابیس در اندروید، نمایش اطلاعات دیتابیس در اندروید استودیو، اتصال به دیتابیس در اندروید استودیو، قرار دادن دیتابیس در اندروید را یاد بگیرید.

برنامه شامل 5 کلاس است. با تعریف DatabaseHelper که زیر کلاس SQLiteOpenHelper است، به شرح زیر شروع می‌کنیم:

DatabaseHelper.java


package com.journaldev.sqlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {

    // Table Name
    public static final String TABLE_NAME = "COUNTRIES";

    // Table columns
    public static final String _ID = "_id";
    public static final String SUBJECT = "subject";
    public static final String DESC = "description";

    // Database Information
    static final String DB_NAME = "JOURNALDEV_COUNTRIES.DB";

    // database version
    static final int DB_VERSION = 1;

    // Creating table query
    private static final String CREATE_TABLE = "create table " + TABLE_NAME + "(" + _ID
            + " INTEGER PRIMARY KEY AUTOINCREMENT, " + SUBJECT + " TEXT NOT NULL, " + DESC + " TEXT);";

    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}

کلاس‌های DBManager جایی است که DatabaseHelper آغاز به کار می‌کند و عملیات CRUD تعریف می‌شود. قطعه کد این کلاس به صورت زیر می‌باشد.

DBManager.java


package com.journaldev.sqlite;


import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

public class DBManager {

    private DatabaseHelper dbHelper;

    private Context context;

    private SQLiteDatabase database;

    public DBManager(Context c) {
        context = c;
    }

    public DBManager open() throws SQLException {
        dbHelper = new DatabaseHelper(context);
        database = dbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        dbHelper.close();
    }

    public void insert(String name, String desc) {
        ContentValues contentValue = new ContentValues();
        contentValue.put(DatabaseHelper.SUBJECT, name);
        contentValue.put(DatabaseHelper.DESC, desc);
        database.insert(DatabaseHelper.TABLE_NAME, null, contentValue);
    }

    public Cursor fetch() {
        String[] columns = new String[] { DatabaseHelper._ID, DatabaseHelper.SUBJECT, DatabaseHelper.DESC };
        Cursor cursor = database.query(DatabaseHelper.TABLE_NAME, columns, null, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
        }
        return cursor;
    }

    public int update(long _id, String name, String desc) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(DatabaseHelper.SUBJECT, name);
        contentValues.put(DatabaseHelper.DESC, desc);
        int i = database.update(DatabaseHelper.TABLE_NAME, contentValues, DatabaseHelper._ID + " = " + _id, null);
        return i;
    }

    public void delete(long _id) {
        database.delete(DatabaseHelper.TABLE_NAME, DatabaseHelper._ID + "=" + _id, null);
    }

}

کلاس CountryListActivity.java این اکتیویتی با شروع برنامه راه اندازی می‌شود. در ادامه یک طرح برای آن تعریف شده است.

fragment_emp_list.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:dividerHeight="1dp"
        android:padding="10dp" >
    </ListView>

    <TextView
        android:id="@+id/empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="@string/empty_list_text" />

</RelativeLayout>

در اینجا یک ListView برای ثبت رکوردهای ذخیره شده در پایگاه داده تعریف شده است. در ابتدا ListView خالی است.

CountryListActivity.java


package com.journaldev.sqlite;

import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;

public class CountryListActivity extends ActionBarActivity {

    private DBManager dbManager;

    private ListView listView;

    private SimpleCursorAdapter adapter;

    final String[] from = new String[] { DatabaseHelper._ID,
            DatabaseHelper.SUBJECT, DatabaseHelper.DESC };

    final int[] to = new int[] { R.id.id, R.id.title, R.id.desc };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fragment_emp_list);

        dbManager = new DBManager(this);
        dbManager.open();
        Cursor cursor = dbManager.fetch();

        listView = (ListView) findViewById(R.id.list_view);
        listView.setEmptyView(findViewById(R.id.empty));

        adapter = new SimpleCursorAdapter(this, R.layout.activity_view_record, cursor, from, to, 0);
        adapter.notifyDataSetChanged();

        listView.setAdapter(adapter);

        // OnCLickListiner For List Items
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long viewId) {
                TextView idTextView = (TextView) view.findViewById(R.id.id);
                TextView titleTextView = (TextView) view.findViewById(R.id.title);
                TextView descTextView = (TextView) view.findViewById(R.id.desc);

                String id = idTextView.getText().toString();
                String title = titleTextView.getText().toString();
                String desc = descTextView.getText().toString();

                Intent modify_intent = new Intent(getApplicationContext(), ModifyCountryActivity.class);
                modify_intent.putExtra("title", title);
                modify_intent.putExtra("desc", desc);
                modify_intent.putExtra("id", id);

                startActivity(modify_intent);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();
        if (id == R.id.add_record) {

            Intent add_mem = new Intent(this, AddCountryActivity.class);
            startActivity(add_mem);

        }
        return super.onOptionsItemSelected(item);
    }

}
در این اکتیویتی از شی DBManager برای انجام عملیات CRUD استفاده می‌شود.
برای اضافه کردن عناصر به لیست  که برای نتایج Query در یک مکان نماست، از یک SimpleCursorAdapter استفاده می‌شود.
با کلیک بر روی آیتم لیست، یک Intent برای باز کردن کلاس ModifyCountryActivity ایجاد می‌شود.

این فهرست شامل یک آیتم برای اضافه کردن یک رکورد جدید از ActionBar است. در اینجا دوباره یک Intent برای باز کردن کلاس AddCountryActivity ایجاد می‌شود. در زیر کد menu.xml آورده شده است.

menu.xml


<menu xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    xmlns:tools="https://schemas.android.com/tools"
    tools:context="com.example.sqlitesample.MainActivity" >

    <item
        android:id="@+id/add_record"
        android:icon="@android:drawable/ic_menu_add"
        android:orderInCategory="100"
        android:title="@string/add_record"
        app:showAsAction="always"/>

</menu>

طرح و کد xml فایل AddCountryActivity.java در زیر تعریف شده است:

activity_add_record.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="20dp" >

    <EditText
        android:id="@+id/subject_edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="@string/enter_title" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/description_edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="@string/enter_desc"
        android:inputType="textMultiLine"
        android:minLines="5" >
    </EditText>

    <Button
        android:id="@+id/add_record"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="@string/add_record" />

</LinearLayout>

دو EditText تعریف شده ورودی‌های مربوط به کشور و ارز را دریافت می‌کنند. همچنین دکمه‌ای برای افزودن مقادیر به پایگاه داده و نمایش آن در ListView تعریف شده است.

AddCountryActivity.java


package com.journaldev.sqlite;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class AddCountryActivity extends Activity implements OnClickListener {

    private Button addTodoBtn;
    private EditText subjectEditText;
    private EditText descEditText;

    private DBManager dbManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setTitle("Add Record");

        setContentView(R.layout.activity_add_record);

        subjectEditText = (EditText) findViewById(R.id.subject_edittext);
        descEditText = (EditText) findViewById(R.id.description_edittext);

        addTodoBtn = (Button) findViewById(R.id.add_record);

        dbManager = new DBManager(this);
        dbManager.open();
        addTodoBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.add_record:

                final String name = subjectEditText.getText().toString();
                final String desc = descEditText.getText().toString();

                dbManager.insert(name, desc);

                Intent main = new Intent(AddCountryActivity.this, CountryListActivity.class)
                        .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                startActivity(main);
                break;
        }
    }

}
وظیفه‌ی عملیات CRUD که در اینجا انجام می‌شود، اضافه کردن یک رکورد جدید به پایگاه داده است.
طرح و کد xml فایل ModifyCountryActivity.java در زیر تعریف شده است:

activity_modify_record.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp" >

    <EditText
        android:id="@+id/subject_edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:ems="10"
        android:hint="@string/enter_title" />

    <EditText
        android:id="@+id/description_edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="@string/enter_desc"
        android:inputType="textMultiLine"
        android:minLines="5" >
    </EditText>


    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:weightSum="2"
        android:gravity="center_horizontal"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btn_update"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/btn_update" />

        <Button
            android:id="@+id/btn_delete"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/btn_delete" />
    </LinearLayout>

</LinearLayout>

این شبیه به طرح قبلی است به جز اینکه دکمه‌های تغییر و حذف اضافه شده‌اند.

ModifyCountryActivity.java


package com.journaldev.sqlite;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class ModifyCountryActivity extends Activity implements OnClickListener {

    private EditText titleText;
    private Button updateBtn, deleteBtn;
    private EditText descText;

    private long _id;

    private DBManager dbManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setTitle("Modify Record");

        setContentView(R.layout.activity_modify_record);

        dbManager = new DBManager(this);
        dbManager.open();

        titleText = (EditText) findViewById(R.id.subject_edittext);
        descText = (EditText) findViewById(R.id.description_edittext);

        updateBtn = (Button) findViewById(R.id.btn_update);
        deleteBtn = (Button) findViewById(R.id.btn_delete);

        Intent intent = getIntent();
        String id = intent.getStringExtra("id");
        String name = intent.getStringExtra("title");
        String desc = intent.getStringExtra("desc");

        _id = Long.parseLong(id);

        titleText.setText(name);
        descText.setText(desc);

        updateBtn.setOnClickListener(this);
        deleteBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_update:
                String title = titleText.getText().toString();
                String desc = descText.getText().toString();

                dbManager.update(_id, title, desc);
                this.returnHome();
                break;

            case R.id.btn_delete:
                dbManager.delete(_id);
                this.returnHome();
                break;
        }
    }

    public void returnHome() {
        Intent home_intent = new Intent(getApplicationContext(), CountryListActivity.class)
                .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(home_intent);
    }
}
عملیات CRUD انجام شده در اینجا بروزرسانی و حذف یک رکورد است.
تصاویر زیر خروجی نهایی پروژه ما هستند.
اولین تصویر خروجی که هنگام راه اندازی برنامه برای اولین بار مشاهده می‌شود:
دیتابیس در اندروید

SQLite در اندروید

تصویر دوم نتیجه‌ی کلیک بر روی گزینه‌ی منو از ActionBar برای اضافه کردن رکورد جدید مطابق شکل زیر است.
دیتابیس در اندروید

SQLite در اندروید

تصویر سوم با افزودن 3 رکورد خروجی را نشان می‌دهد.
SQLite در اندروید

SQLite در اندروید

تصویر چهارم هنگامی که روی هر آیتم از لیست کلیک ‌شود، رکورد اصلاح  یا حذف می‌شود.

SQLite در اندروید

تصویر نهایی، تصویری از حذف یک رکورد است. در این مثال ما اولین رکورد را حذف می‌کنیم.(خواندن اطلاعات از دیتابیس در اندروید)
SQLite در اندروید

SQLite در اندروید

باز کردن پرونده پایگاه داده SQLite در اندروید

همان‌طور که پیش‌تر در این مقاله‌ی آموزشی صحبت کردیم، فایل پایگاه داده در حافظه‌ی داخلی ذخیره می‌شود که از طریق دستگاه Android قابل دسترسی است.

SQLite در اندروید

برای مشاهده‌ی این پایگاه داده باید این پرونده را از دستگاه به دسکتاپ خود بکشیم. همان‌طور که در تصویر زیر دیده می‌شود، با کلیک روی گزینه‌ی منو در بالا سمت راست این کار انجام می‌شود:
برای باز کردن این فایل، SQLiteBrowser را دانلود کنید.
تصویر زیر طرح و جداول موجود در مرورگر را نشان می‌دهد.

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

برای مشاهده‌ی جدول به تصویر بالا رجوع کنید. در نهایت تصویر زیر را مشاهده خواهید کرد.
SQLite در اندروید

SQLite در اندروید

جمع بندی:
در این مقاله به بحث درباره‌ی دیتابیس در اندروید پرداختیم. همچنین نحوه‌ی کار با sqlite در android ، قرار دادن دیتابیس، اتصال به دیتابیس، گرفتن اطلاعات از دیتابیس و نمایش اطلاعات دیتابیس در اندروید استودیو را یاد گرفتید. امیدواریم این مقاله برای شما مفید بوده باشد. اگر در این زمینه تجربه‌ یا سوالی دارید خوشحال می‌شویم آن را با ما و کاربران وب سایت سون لرن به اشتراک بگذارید.
منابع:
 پروژه نهایی Android SQLite از لینک زیر قابل بارگیری است.

Download Android SQLite Example Project

اگر به یادگیری بیشتر در زمینه‌ی برنامه نویسی اندروید علاقه داری، با شرکت در دوره‌ی آموزشی متخصص اندروید در کمتر از یکسال به یک توسعه‌دهنده اندروید همه فن حریف تبدیل می‌شوی که آماده‌ی استخدام، دریافت پروژه و حتی پیاده‌سازی اپلیکیشن خودت هستی.

چه امتیازی به این مقاله می دید؟

نظرات کاربران

اولین دیدگاه این پست رو تو بنویس !

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :