در قسمت سوم آموزش اندروید بانک اطلاعاتی با استفاده از برنامه نویسی SQLite را آموزش میدهیم.در این بخش به دستورات SQL بسیار نیاز داریم و در صورت نیاز میتوان به آموزش های SQL در همین سایت مراجعه کنید.
نوع دیگر استفاده از بانک اطلاعاتی , استفاده بصورت برنامه نویسی و بصورت دستورات SQL است(آموزش های SQL به طور کامل در سایت موجود است و میتوانید استفاده کنید) که در این روش اطلاعات در یک فایل متنی درون دستگاه در مسیری که در ادامه مشخص میکنیم ذخیره میشود برای استفاده از این روش باید از پکیج android.database.sqlite استفاده شود که شامل کلاس هایی برای مدیریت و استفاده از بانک اطلاعاتی میباشد.
مثالی ساده و کاربردی که ۴عمل اصلی Insert, Delete, Update, Read را در ادامه بررسی خواهیم کرد.پروژه جدیدی با نام DataBasePrj ایجاد کرده و در فایل activity_main.xml ابزار زیر را ایجاد میکنیم
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" 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.databaseprj.MainActivity" > <Button android:id="@+id/btnshow" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/btnedit" android:layout_marginTop="22dp" android:text="SHOW" /> <Button android:id="@+id/btnedit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/btnshow" android:layout_centerVertical="true" android:layout_marginRight="17dp" android:text="EDIT" /> <Button android:id="@+id/btndel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/btnshow" android:layout_centerHorizontal="true" android:text="DELETE" /> <Button android:id="@+id/btnadd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/btnshow" android:layout_alignLeft="@+id/btnshow" android:text="ADD" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/btnadd" android:layout_alignParentTop="true" android:layout_marginTop="30dp" android:text="id" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView1" android:layout_below="@+id/textView1" android:layout_marginTop="35dp" android:text="Name" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView2" android:layout_below="@+id/textView2" android:layout_marginTop="31dp" android:text="Family" /> <EditText android:id="@+id/edtid" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/textView1" android:layout_alignBottom="@+id/textView1" android:layout_alignRight="@+id/btnshow" android:ems="10" /> <EditText android:id="@+id/edtfam" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/edtname" android:layout_alignTop="@+id/textView3" android:ems="10" /> <EditText android:id="@+id/edtname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/edtid" android:layout_alignTop="@+id/textView2" android:ems="10" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/btnshow" android:layout_alignRight="@+id/btnshow" android:layout_below="@+id/btnshow" android:layout_marginTop="22dp" android:text="Show By ID" /> </RelativeLayout>
همانگونه که مشخص است و دیگر نیاز به توضیح مجدد نیست میتوان ابزار را بصورت گرافیکی و خیلی راحت ایجاد کرد ما در این مثال سه EditText برای وارد کردن مشخصات و ۵ دکمه که هرکدام عمل مشخصی انجام میدهند و در ادامه مشخص میشوند قرار داده ایم.
حال در فایل جاوا نیز چنین کدنویسی میکنیم
package com.example.databaseprj; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import android.database.Cursor; import android.database.sqlite.*; public class MainActivity extends Activity { Button btnadd , btnedit, btnshow, btndel, btnone; EditText edtid, edtname, edtfamil; SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnadd=(Button)findViewById(R.id.btnadd); btnedit=(Button)findViewById(R.id.btnedit); btnshow=(Button)findViewById(R.id.btnshow); btndel=(Button)findViewById(R.id.btndel); btnone=(Button)findViewById(R.id.button1); edtid=(EditText)findViewById(R.id.edtid); edtname=(EditText)findViewById(R.id.edtname); edtfamil=(EditText)findViewById(R.id.edtfam); db=openOrCreateDatabase("DBStudent", MODE_PRIVATE, null); db.execSQL("create table if not exists student(id nchar, name varchar, family varchar);"); btnadd.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { db.execSQL("insert into student values('" + edtid.getText() + "', '" + edtname.getText() + "' , '" + edtfamil.getText() + "');"); showmess("Record Added"); beclear(); } }); btndel.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //searching for id Cursor c=db.rawQuery("select * from student where id='" + edtid.getText() + "'", null); if(c.moveToFirst()){ db.execSQL("delete from student where id='" + edtid.getText() + "'"); showmess("Record Deleted"); beclear();} else { showmess("Record with this id number doesnt found"); } } }); btnedit.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Cursor c=db.rawQuery( "select * from student where id='" + edtid.getText() + "'", null); if(c.moveToFirst()){ db.execSQL("update student set name='" + edtname.getText() + "' ,family='" + edtfamil.getText() + "' where id='" + edtid.getText() +"'"); showmess("Update was Done"); beclear(); } else{ showmess("Record with this id number doesnt found"); } } }); btnshow.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { StringBuffer buffer=new StringBuffer(); //Search for Table Records Cursor c=db.rawQuery("select * from student", null); if(c.getCount()==0){ showmess("no Records Found"); } else{ //appending records to the StringBuffer while(c.moveToNext()){ buffer.append("id " + c.getString(0) + "\n"); buffer.append("name " + c.getString(1) + "\n"); buffer.append("family " + c.getString(2) + "\n"); } //show All Records showmess(buffer.toString()); } } }); btnone.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Cursor c=db.rawQuery("select * from student where id='" + edtid.getText() + "'", null); if(c.moveToFirst()){ edtname.setText(c.getString(1)); edtfamil.setText(c.getString(2)); } else{ showmess("Record with this id number doesnt found"); } } }); } public void showmess(String str){ Toast.makeText(getBaseContext(), str, Toast.LENGTH_SHORT).show(); } public void beclear(){ edtid.setText(""); edtname.setText(""); edtfamil.setText(""); } }
در فایل جاوا برنامه علاوه بر importهایی که مربوط به بانک هستند و لازم, ابتدا اشیا را تعریف کرده و با استفاده از متد findViewById() آنهارا به یک متغیر که از نوع همان شی است اطلاق میکنیم همچنین یک متغیر از نوع SQLiteDatabase که در ادامه از این متغیر برای اعمال دستورات مختلف به اطلاعات استفاده میکنیم.
قدم بعدی ایجاد بانک و جدول با استفاده از متغیر SQLiteDatabase است که بدین صورت ایجاد میشود
db=openOrCreateDatabase("DBStudent", MODE_PRIVATE, null); db.execSQL("create table if not exists student(id nchar, name varchar, family varchar);");
شکل کلی متد ()openOrCreateDatabase بدین صورت است
SQLiteDatabase mydatabase=openOrCreateDatabase("Database Name", MODE_PRIVATE,null)
پارامتر اول که نام دیتابیس(فایلی که در دستگاه ذخیره میشود) است, پارامتر دوم Mode مربوط به بانک رامشخص میکند که Private بدین معنی است که تنها توسط این برنامه(Application) اجرا شود و پارامتر سوم هم شی Cursor Factory است که میتواند null باشد.
متد execSQL() نیز برای اعمال هر نوع دستور SQL از جمله Insert , Delete , Select و… میباشد که در این مرحله نیز ما با استفاده از دستور create اقدام به ایجاد یک جدول بانام student و فیلدها با نوع های مشخص شده کرده ایم.
حال برای هرکدام از دکمه ها با استفاده از ()setOnClickListener دستورات اجرایی مربوط را کدنویسی میکنیم
btnadd.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { db.execSQL("insert into student values('" + edtid.getText() + "', '" + edtname.getText() + "' , '" + edtfamil.getText() + "');"); showmess("Record Added"); beclear(); } });
اگر با دستورات SQL آَشنا باشید این قسمت راحتترین بخش برنامه برای شما خواهد بود! اما اگر آشنایی چندانی ندارید پیشنهاد میشود ابتدا یک نگاه مختصر و مفیدی به آموزش های SQL کنید تا با اعتماد به نفس بیشتری شروع به کدنویسی کنید.
برای دکمه btnadd دستور insert نوشته شده و مقادیر فیلدهای جدول نیز مقادیر رشته ای ست که درون EditText ها توسط کاربرتایپ شده. سپس با استفاده از دو متد showmess و beclear که در انتها نوشته شده پیغام مناسب نمایش داده میشود و مقدار درون EditText ها خالی میشود.
btndel.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //searching for id Cursor c=db.rawQuery( "select * from student where id='" + edtid.getText() + "'", null); if(c.moveToFirst()){ db.execSQL("delete from student where id='" + edtid.getText() + "'"); showmess("Record Deleted"); beclear();} else { showmess("Record with this id number doesnt found"); } } });
برای دکمه Delete که برای حذف رکورد براساس مقدار id است که توسط کاربر وارد میشود باید ابتدا با استفاده از دستور select که در متد rawQuery انجام میشود و نتیجه در متغیری ازجنس Cursor قرار میگیرد در جدول برای ای دی وارد شده توسط کاربر جستجو کرده و با استفاده از متد moveToFirst که که اگر نتیجه True باشد این بار دستور delete را در متد execSQL قرار میدهیم اگر False باشد پیغام مبنی بر یافت نشدن رکورد.
برای دکمه Update نیز از همین تکنیک استفاده میکنیم و مقادیر را براساس ای دی وارد شده تغییر میدهیم.اما برای دکمه
btnshow.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { StringBuffer buffer=new StringBuffer(); //Search for Table Records Cursor c=db.rawQuery("select * from student", null); if(c.getCount()==0){ showmess("no Records Found"); } else{ //appending records to the StringBuffer while(c.moveToNext()){ buffer.append("id " + c.getString(0) + "\n"); buffer.append("name " + c.getString(1) + "\n"); buffer.append("family " + c.getString(2) + "\n"); } //show All Records showmess(buffer.toString()); } } });
ابتدا در جدول جستجو میکند و در صورت خالی نبودن جدول از شیی از جنس StringBuffer استفاده میکنیم و تا زمانی که به انتها رکوردهای جدول نرسیده ایم مقادیر هر رکورد را در شی بافر append میکنیم و درانتها در یک پیغام Toast نمایش میدهیم.
دکمه btnone نیز براساس ای دی که کاربر وارد میکند مقادیر name , family پیدا شده و در EditText ها قرار میگیرد.
برای مثال نتیجه دکمه btnshow بدین صورت خواهد بود
برای مشاهده فایل متنی Database نیز کافیست به قسمت DDMS رفته سپس FileExplorer را انتخاب کرده و مسیر زیر را انتخاب کنید