آموزش آپدیت اطلاعات دیتابیس SQLite در اندروید
با نام و یاد خدا
امیدوارم سه آموزش قبل رو مطالعه و به صورت عملی اجرا کرده باشید تا برای آموزش امروز آماده باشید. در جلسات قبل نحوه ایجاد دیتابیس و جدول و افزودن و حذف اطلاعات از دیتابیس را توضیح دادیم امروز می خواهیم به آموزش آپدیت اطلاعات دیتابیس SQLite در اندروید بپردازیم. این آموزش کمی طولانی است ولی شفاف و گویا و همراه با تصویر است پس تا آخر آموزش با ما همراه باشید.
توجه: توصیه می شود آموزش سه جلسه قبل را مطالعه کنید تا برای این آموزش آماده باشید.
نقشه ذهنی
برای راحتی کار و فهم بهتر آموزش امروز ابتدا یک نقشه ذهنی برای شما طراحی می کنم:
همانطور که در تصویر بالا مشخص است ما یک اکتیویتی1 (MainActivity) داریم که در آن یک شی از کلاس myDatabaseHelper ایجاد کردیم تا به توابع آن دسترسی داشته باشد در اکتیویتی1 و layout1 تنظیم کردیم که عمل insert و delete صورت گیرد(طبق آموزش جلسات قبل)
در این جلسه می خواهیم update را برای دیتابیس بنویسیم. برای راحت شدن فهم آن، یک اکتیویتی و layout دیگری ایجاد می کنیم و در آن با گرفتن آی دی و یک نام جدید آپدیت صورت می گیرد .
ایجاد دکمه “صفحه بعد” در MainActivity
- طبق نقشه بالا در MainActivity یک دکمه با نام “صفحه بعد” باید ایجاد کنیم. پس فایل activity_main.xml (در شاخه res->layout) را باز کنید و در ادامه طراحی هایی که در جلسات گذشته انجام دادیم ، یک Button به layout اضافه کنید.
ID: btnNextPage
onClick: onBtnNextPageClick ( مدیریت رویدادها را در جلسه 11 آموزش دادیم)
text: صفحه بعد
- خصوصیت onClick دکمه را onBtnNextPageClick قرار دادیم (طبق آموزش مدیریت Eventها) بنابراین بعد از تابع onCreate یک تابع با نام onBtnNextPageClick ایجاد می کنیم و یک ورودی از نوع Veiw می گیرد. داخل تابع onClick یک Intent تعریف می کنیم تا با فشردن این دکمه از این اکتیویتی MainActivity به اکتیویتی NewPageActivity برود.
public void onBtnNextPageClick(View v){
Intent i =new Intent(MainActivity.this,NewPageActivity.class);
startActivity(i);
}
ایجاد دستور update برای دیتابیس
حالا سراغ کلاس myDatabaseHelper می رویم و در ادامه توابع insert و delete که جلسات قبل ایجاد کردیم، تابع update با نام updateData اضافه می کنیم. تابع به صورت زیر است:
//تابع آپدیت
public boolean updateData(String id,String n){
//اتصال به دیتابیس قابل نوشتن
SQLiteDatabase db=this.getWritableDatabase();
//برای ایجاد جفت مقدار و شناسه ستون
ContentValues cv=new ContentValues();
cv.put(“name”,n);
//آپدیت اطلاعات دیتابیس
long result=db.update(TBL_NAME,cv,”Id=?”,new String [] {id});
//بررسی آپدیت اطلاعات
if(result<1)
return false;
else
return true;
}
توضیح کد:
- یک تابع با مقدار برگشتی Boolean تعریف می کنیم که دو متغیر از ورودی دریافت می کند با نام های id و n:
public boolean updateData(String id,String n){
}
- خط بعدی برای اجرای عملیات update اتصال با دیتابیس را برقرار می کند و آن را قابل نوشتن می کند.
SQLiteDatabase db=this.getWritableDatabase();
- یک شی از نوع contentValues تعریف می کنیم با نام دلخواه cv :
ContentValues cv=new ContentValues();
- با کمک شی cv مقداری که کاربر برای نام وارد می کند را به ستون مربوط به خودشون ربط می دهیم برای این کار از متد put استفاده می کنیم. به شکل زیر:
cv.put(“name”,n);
- تابع update دیتابیس را می نویسیم که 4 ورودی از ما می خواهد:
long result=db.update(TBL_NAME,cv,”Id=?”,new String [] {id});
اول : نام جدولی که می خواهید عملیات update روی آن انجام شود: TBL_NAME
دوم : شی cv که شامل مقدار جدید است
سوم : کدام ستون . در واقع ما برای پیدا کردن سطری که قرار است ویرایش شود از شناسه منحصر به فرد “آی دی” استفاده می کنیم و چون مقدارش هنوز مشخص نشده با =؟ نمایش می دهیم.
چهارم : مقدار id را از ورودی تابع updateData دریافت می کند ولی چون تابع update آرایه می پذیرد id را از string به آرایه تبدیل می کنیم.
- مقدار برگشتی تابع را به result می دهیم اگر مقدار result کمتر از یک بود یعنی سطری آپدیت نشده و false برگردان در غیر این صورت true برگرداند.
if(result<1)
return false;
else
return true;
ایجاد اکتیویتی 2 با نام NewPageActivity
- روی زیر شاخه java راست کلیک کنید و یک اکتیویتی جدید با نام NewPageActivity ایجاد کنید.
ایجاد layout
ابتدا layout مورد نظر خود را طراحی می کنیم سپس سراغ اکتیویتی آن می رویم . طبق شکل اول آن را طراحی می کنیم:
- یک plain text برای وارد کردن نام انتخاب می کنیم . مشخصات زیر را برای آن تغییر می دهیم(مشابه تصویر زیر):
ID: etidForUpdate
hint:آی دی را وارد کنید
- یک plain text دیگر برای وارد کردن نام جدید قرار می دهیم با مشخصات زیر:(تصویری مشابه بالا)
ID: etNameForUpdate
hint:نام جدید را وارد کنید
- حالا یک button را انتخاب می کنیم و روی صفحه قرار می دهیم . تا زمانی که کاربر نام جدید و id را وارد کرد و روی این دکمه کلیک کرد نام مربوط به آن id حذف شود نام جدید به جای آن در دیتابیس ذخیره شود:
ID: btnUpdate
onClick: onBtnUpdateClick ( مدیریت رویدادها را در جلسه 11 آموزش دادیم)
text: ویرایش
- یک button دیگر هم قرار می دهیم تا در صورت تمایل به بازگشت به اکتیویتی قبل ،آن را کلیک کنیم.(مشابه تصویر زیر)
ID: btnBack
onClick: onBtnBackClick ( مدیریت رویدادها را درجلسه 11 آموزش دادیم)
text: بازگشت
با قرار دادن این آبجکت ها در layout ، یک سری کد در قسمت text ایجاد می شوند که به صورت زیر می باشد:
<?xml version=”1.0″ encoding=”utf-8″?>
<RelativeLayout 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”
tools:context=”.NewPageActivity”>
<EditText
android:id=”@+id/etidForUpdate”
android:layout_width=”241dp”
android:layout_height=”wrap_content”
android:layout_alignParentTop=”true”
android:layout_centerHorizontal=”true”
android:layout_marginTop=”53dp”
android:ems=”10″
android:hint=”آی دی را وارد کنید”
android:inputType=”textPersonName”
tools:layout_editor_absoluteX=”280dp”
tools:layout_editor_absoluteY=”184dp” />
<EditText
android:id=”@+id/etNameForUpdate”
android:layout_width=”231dp”
android:layout_height=”wrap_content”
android:layout_alignParentTop=”true”
android:layout_centerHorizontal=”true”
android:layout_marginTop=”148dp”
android:ems=”10″
android:hint=”نام جدید را وارد کنید”
android:inputType=”textPersonName”
tools:layout_editor_absoluteX=”292dp”
tools:layout_editor_absoluteY=”305dp” />
<Button
android:id=”@+id/btnUpdate”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_alignParentBottom=”true”
android:layout_centerHorizontal=”true”
android:layout_marginBottom=”169dp”
android:onClick=”onBtnUpdateClick”
android:text=”ویرایش” />
<Button
android:id=”@+id/btnBack”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_alignParentBottom=”true”
android:layout_centerHorizontal=”true”
android:layout_marginBottom=”81dp”
android:onClick=”onBtnBackClick”
android:text=”بازگشت” />
</RelativeLayout>
کدهای موجود در اکتیویتی NewPageActivity
حالا سراغ اکتیویتی مربوط به NewPageActivity می رویم.کدهای آن به صورت کلی به شکل زیر می باشد:
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class NewPageActivity extends AppCompatActivity {
//تعریف متغیرها
myDatabaseHelper mydb;
EditText etid,etname;
String mes=””;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_page);
// ایجاد شی از کلاس
mydb=new myDatabaseHelper(this);
}
//دکمه بازگشت: انتقال از این اکتیویتی به اکتیویتی قبل
public void onBtnBackClick(View v){
Intent i=new Intent(NewPageActivity.this,MainActivity.class);
startActivity(i);
}
//فراخوانی تابع آپدیت اطلاعات
public void onBtnUpdateClick(View v){
//نسبت دادن اشیا لایوت به متغیر اکتیویتی
etid=findViewById(R.id.etidForUpdate);
etname=findViewById(R.id.etNameForUpdate);
//تبدیل به string
String strid=etid.getText().toString();
String strname=etname.getText().toString();
//چک کردن ورودی
if(strname.length()>0 && strid.length()>0){
//دادن متغیر ها به ورودی تابع آپدیت
boolean f=mydb.updateData(strid,strname);
if(f==true)
mes=”آپدیت شد”;
else
mes=”آپدیت نشد”;
//نمایش پیغام
Toast.makeText(NewPageActivity.this,mes,Toast.LENGTH_LONG).show();
}
//کاربر آی دی و نام را وارد نکرده است
else {
etid.setHint(“لطفاآی دی را وارد کنید”);
etname.setHint(“لطفا نام جدید را وارد کنید”);
return;
}
}
}
توضیح کد:
- ابتدا یک شی از کلاس myDataBaseHelper ایجاد می کنیم تا به تابع update آن دسترسی داشته باشیم .متغیری از نوع myDatabaseHelper تعریف می کنیم در سطح کلاس:
myDatabaseHelper mydb;
- داخل متد onCreate آن شی را ایجاد می کنیم.
mydb=new myDatabaseHelper(this);
- بعد از تابع onCreate تابع click مربوط به دکمه بازگشت را می نویسیم که دقیقا مشابه دکمه “صفحه بعد” هست با این تفاوت که با فشردن این دکمه از این کلاس به کلاس MainActivity می رویم.
public void onBtnBackClick(View v){
Intent i=new Intent(NewPageActivity.this,MainActivity.class);
startActivity(i);
}
- دو متغیر از نوع EditText با نام etname و edtid ایجاد می کنیم تا دو شی plain text ای که در layout قرار دادیم را با کمک id به آن نسبت دهیم . سپس مقادیر وارد شده را به رشته تبدیل می کنیم و در متغیرهایstrname و strid ذخیره می کنیم.
- ابتدا با یک شرط if چک می کنیم کاربر مقدار آی دی و نام را وارد کرده یا خیر؟ سپس فراخوانی تابع updateData را انجام می دهیم و دو مقدار strid,strname را به عنوان ورودی به آن می دهیم سپس بررسی می کنیم که مقدار برگشتی true بوده یا false. و پیغام مناسب را چاپ می کنیم.
if(strname.length()>0 && strid.length()>0){
boolean f=mydb.updateData(strid,strname);
if(f==true)
mes=”آپدیت شد”;
else
mes=”آپدیت نشد”;
Toast.makeText(NewPageActivity.this,mes,Toast.LENGTH_LONG).show();
}
else {
etid.setHint(“لطفاآی دی را وارد کنید”);
etname.setHint(“لطفا نام جدید را وارد کنید”);
return;
}
اجرای برنامه
ما این برنامه روی گوشی اجرا می کنیم(طبق آموزش جلسه پنجم) و یک آی دی که قبلا وجود داشته و یک نام جدید وارد می کنیم تا آپدیت کند. همانطور که در تصویر زیر می بینید ما آی دی ۲ را وارد کردیم و نام جدید مهدی را آپدیت کردیم:
نکته: به صورت کلی برای استفاده از تابع آپدیت (و حذف )نیاز به یک id می باشدکه در این برنامه به صورت مستقیم از کاربر دریافت کردیم ولی بهتر بود که layout را طوری طراحی کنیم که جدول به کاربر نمایش داده شود و کاربر با انتخاب ردیف مورد نظر و وارد کردن نام جدید و زدن دکمه ویرایش، عملیات آپدیت صورت گیرد.
در این جلسه با آموزش آپدیت اطلاعات دیتابیس SQLite در اندروید با ما همراه بودید .هر چند آموزش کمی طولانی بود ولی امیدواریم پاسخگوی نیاز شما باشد. در جلسه بعد به نحوه select کردن اطلاعات در دیتابیس می پردازیم. با ما همراه باشید.
لطفا سوالات و پیشنهادات خود را در قسمت دیدگاه ها با در میان بگذارید.
واقعا دست شما درد نکنه . عالی بود و خیلی کمک کرد .
سلام و خسته نباشید.استاد بقیه اموزش ها رو نمیذارید؟
سلام و عرض ادب
به زودی آماده و ارائه می گردد.
با تشکر از همراهی شما
دست درد نکنه برادر .عالی بود
قسمت ۱۲ تا ۱۶ عالی بود.مرسی
سلام و عرض ادب. امیدواریم مطالب برای شما و دوستان مفید بوده باشد. با تشکر از همراهی شما
سلام استاد من کد رو درست زدم ولی دست آخر پیغام آپدیت نشد میدهه.نمیدونم علتش چیه؟
با سلام خدمت شما آقای مهندس من تمامی مراحلی رو که گفته بودید رفتم.ولی نمی دونم چرا به جای پیغام آپدیت شد پیغام آپدیت نشد میده ؟نمیدونید علتش چیه؟
عالی بود.خدا خیرتان بدهد.
خدا وکیل خیلی کارت عالی بود
من چند اموزش ویدیویی دیده بودم ولی چون زیادی پیچیده اش کرده بودن گیج میشدم(اول می رفتن سراغ معماری کد نویسی و …)
ولی شما با توضیحات ساده و بدون پیچیدگی اصل مطلب رو اموزش دادی…. خدا خیرت بده وحس خوب این اموزش ها رایحه زندگیت باشه…
گاهی وقتا اموزش از روی متن واقعا صد برابر تاثیر بیشتری از فیلم داره..