بانک اطلاعاتی (دیتابیس) در اندروید

بانک اطلاعاتی که در اندروید استودیو از آن استفاده می شود SQLite نام دارد که برای استفاده از آن باید کلاسی ایجاد کرد که از کلاس SQLiteOpenHelper مشتق شود.

public class Database extends SQLiteOpenHelper {

کلاس ایجاد شده باید دارای متدهای سازنده، () onCreate و () onUpgrade باشد. چنانچه قصد ایجاد یک بانک اطلاعاتی داریم باید ابتدا نام آنرا در یک متغیر ذخیره کنیم و در بخش super سازنده به همراه شماره ورژن آن معرفی شود. نام جدول نیز در متغیری ذخیره می شود. دستور ایجاد جدول جدید در یک متغیر رشته ای به صورت زیر تعریف می شود.

private String sqlTable="CREATE TABLE "+ myTable +"(" +
            "  [id] INT PRIMARY KEY NOT NULL UNIQUE," +
            "  [name] TEXT, " +
            "  [phone] TEXT)";

همانطوریکه مشاهده می شود نام جدول در متغیر myTable است و جدول دارای سه فیلد id ، name و field است. اجرای کد فوق در متد () onCreate انجام می شود که از تابع execSql استفاده می شود. کد کامل مطالب گفته شده به صورت زیر است:

public class Database extends SQLiteOpenHelper {
    private static final String dbName="myDb";
    private static final String myTable="myTable";
    private String sqlTable="CREATE TABLE "+ myTable +"(" +
            "  [id] INT PRIMARY KEY NOT NULL UNIQUE," +
            "  [name] TEXT, " +
            "  [phone] TEXT)";

    public Database(Context context) {
        super(context, dbName, null, 1);
    }

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

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

حال جهت اجرا به کلاس mainActivity میرویم و در متد () onCreate کد زیر را می نویسیم.

SQLiteDatabase db=dbHelper.getWritableDatabase();
        if (db.isOpen()){
            db.close();
            Log.i("db","OK");
        }

جهت درج رکورد جدید ابتدا فرمی برای دریافت اطلاعات ایجاد می کنیم. که کد xml آن به صورت زیر آمده است.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="ir.faratez.msession5.MainActivity">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="10">

        <ImageView
            android:id="@+id/imageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:srcCompat="@android:drawable/sym_def_app_icon" />

        <EditText
            android:id="@+id/edt_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="9"
            android:ems="10"
            android:hint="Name"
            android:inputType="textPersonName" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="10">

        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="10dp"
            android:layout_weight="1.75"
            android:background="@android:color/darker_gray"
            app:srcCompat="@android:drawable/stat_sys_speakerphone" />

        <EditText
            android:id="@+id/edt_phone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_weight="6.89"
            android:ems="10"
            android:hint="Phone"
            android:inputType="phone" />
    </LinearLayout>

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="ذخیره" />

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

ابزار listView که در پایین قرار گرفته برای قسمت بعد می باشد که قصد نمایش اطلاعات را داریم.

حال جهت درج رکورد جدید به کلاس database میرویم و متدی با نام دلخواه insert2Table در آن به صورت زیر ایجاد می کنیم:

public void insert2Table(String name, String phone){

        SQLiteDatabase db=getWritableDatabase();
        String q="select * from "+myTable;
        Cursor cursor= db.rawQuery(q,null);
        ContentValues cv=new ContentValues();
        cv.put("name",name);
        cv.put("phone",phone);
        cv.put("id",cursor.getCount()+1);
        Long insertId= db.insert(myTable,null,cv);

        Log.i("id","inserted: "+insertId);
        db.close();
    }

در ادامه به mainActivity میرویم و ابتدا عناصر را به صورت عمومی معرفی می کنیم:

Database dbHelper;
    EditText edtName,edtPhone;
    Button btn;

سپس آنها را در onCreate تعریف می کنیم:

edtName= (EditText) findViewById(R.id.edt_name);
        edtPhone= (EditText) findViewById(R.id.edt_phone);
        btn= (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String n="",p="";
                n=edtName.getText().toString();
                p=edtPhone.getText().toString();
                //Toast.makeText(MainActivity.this, n+"\n "+p, Toast.LENGTH_SHORT).show();
                dbHelper.insert2Table(n,p);
                Toast.makeText(MainActivity.this, "Inserted!", Toast.LENGTH_SHORT).show();
               
            }
        });

برنامه را اجرا کنید داده وارد کنید و بررسی کنید اضافه شده یا خیر.

جهت نمایش اطلاعات درج شده ابتدا باید برای listView یک لایه بسازیم. برای این منظور در لایه جدیدی در پوشه Layout این کار انجام می شود:

<TextView
    android:id="@+id/tvName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="TextView"
    android:textColor="@android:color/background_dark"
    android:textSize="24sp" />

<TextView
    android:id="@+id/tvPhone"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="15dp"
    android:text="TextView"
    android:textSize="18sp" />

پس از افزودن لایه باید جهت نمایش تمام اطلاعات به کلاس database برویم و متد با نام دلخواه getFullList در آن ایجاد می کنیم:

public String[][] getFullList(){
        SQLiteDatabase db=getWritableDatabase();
        String q="select * from "+myTable;
        Cursor cursor= db.rawQuery(q,null);
        String[][] r=new String[3][cursor.getCount()];
        for (int i=0;i<cursor.getCount();i++){
            cursor.moveToPosition(i);
            r[1][i]=cursor.getString(1);
            r[2][i]=cursor.getString(2);
        }

        db.close();
        return r;

    }

سپس یک متغیر آرایه دوبعدی برای نگهداری رکوردهای بازیابی شده عمومی تعریف می کنیم:

String[][] res;

سپس به MainActivity می رویم و خارج از oncreate در کلاس MainActivity یک کلاس دیگر تعریف می کنیم.

class AA extends ArrayAdapter<String>{

        public AA() {
            super(MainActivity.this, R.layout.a_row_of_list,res[0]);
        }

        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            LayoutInflater in=getLayoutInflater();
            View row=in.inflate(R.layout.a_row_of_list,parent,false);
            TextView tv_name= (TextView) row.findViewById(R.id.tvName);
            TextView tv_phone= (TextView) row.findViewById(R.id.tvPhone);
            tv_name.setText(res[1][position]);
            tv_phone.setText(res[2][position]);
            return row;
        }
    }

جهت اجرا در onCreate کد زیر را می نویسیم:

res=dbHelper.getFullList();
        list= (ListView) findViewById(R.id.list);
        list.setAdapter(new AA());

جهت نمایش رکورد جدید اضافه شده به جدول در لیست کد زیر را به onClick دکمه اضافه می کنیم:

res=dbHelper.getFullList();
                
                list.setAdapter(new AA());

کد کلاس MainActivity به صورت زیر است:

package ir.faratez.msession5;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    Database dbHelper;
    EditText edtName,edtPhone;
    Button btn;
    String[][] res;
    ListView list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dbHelper=new Database(this);
        SQLiteDatabase db=dbHelper.getWritableDatabase();
        if (db.isOpen()){
            db.close();
            Log.i("db","OK");
        }
        

        res=dbHelper.getFullList();
        list= (ListView) findViewById(R.id.list);
        list.setAdapter(new AA());
	edtName= (EditText) findViewById(R.id.edt_name);
        edtPhone= (EditText) findViewById(R.id.edt_phone);
        btn= (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String n="",p="";
                n=edtName.getText().toString();
                p=edtPhone.getText().toString();
                //Toast.makeText(MainActivity.this, n+"\n "+p, Toast.LENGTH_SHORT).show();
                dbHelper.insert2Table(n,p);
                Toast.makeText(MainActivity.this, "Inserted!", Toast.LENGTH_SHORT).show();
                res=dbHelper.getFullList();
                
                list.setAdapter(new AA());
            }
        });
    }

    class AA extends ArrayAdapter<String>{

        public AA() {
            super(MainActivity.this, R.layout.a_row_of_list,res[0]);
        }

        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            LayoutInflater in=getLayoutInflater();
            View row=in.inflate(R.layout.a_row_of_list,parent,false);
            TextView tv_name= (TextView) row.findViewById(R.id.tvName);
            TextView tv_phone= (TextView) row.findViewById(R.id.tvPhone);
            tv_name.setText(res[1][position]);
            tv_phone.setText(res[2][position]);
            return row;
        }
    }
}