دستور select در دیتابیس SQLite اندروید
با نام و یاد خدا
امیدواریم تا اینجای کار از آموزش های مربوط به دیتابیس در اندروید راضی بوده باشید امروز به آخرین مبحث از این موضوع یعنی دستور select در دیتابیس SQLite اندروید می پردازیم. از جلسه دوازدهم مبحث کار با دیتابیس را در قالب یک پروژه کوچک شروع کردیم و دستورات insert، delete و update را به صورت کامل گفتیم. امروز دستور select برای نمایش داده ها را آموزش خواهیم داد.
توجه: توصیه می شود از آموزش جلسه ۱۲ شروع کنید تا برای این آموزش آماده باشید.مباحث به صورت پیوسته بیان شده است.
ایجاد دکمه “نمایش داده ها” در لایوت NewPageActivity
ابتدا فایل activity_new_page.xml (در شاخه res->layout) را باز کنید و در ادامه طراحی هایی که در جلسه گذشته انجام دادیم ، یک Button به layout اضافه کنید.(تابع کلیک این دکمه را در ادامه خواهیم داد)
ID: btnShowAll
onClick: onBtnShowAllClick ( مدیریت رویدادها را در جلسه 11 آموزش دادیم)
text: نمایش داده ها
ایجاد دستور Select برای دیتابیس
کلاس myDatabaseHelper را باز کنید (در جلسه ۱۲ ایجاد کردیم) و در ادامه توابع insert و delete و update که در جلسات قبل ایجاد کردیم تابع select را با نام دلخواه ShowallData به شکل زیر می نویسیم:
//تابع نمایش اطلاعات
public Cursor ShowallData(){
SQLiteDatabase db=this.getWritableDatabase();
Cursor result=db.rawQuery(“select * from ” + TBL_NAME,null);
return result;
}
توضیح کد:
- تابع ShowallData ورودی لازم ندارد فقط اطلاعات را برمی گرداند. مقدار برگشتی آن را از نوع Cursor تعریف کردیم .
Cursor: نوعی است که متغیر از هر نوع را در برمی گیرد.(چون داده های ما شمامل عدد و متن می باشد از این نوع استفاده می کنیم)
public Cursor ShowallData(){
}
- دستور ثابت که در تمام توابع (اضافه و حذف و آپدیت) نوشتیم تا اتصال به دیتابیس قابل تغییر برقرار شود.
SQLiteDatabase db=this.getWritableDatabase();
- با استفاده از شی sqLiteDatabase و دستور rawQuery یک دستور SQL را در پایگاه داده اجرا میکنیم :
آرگومان اول: دستور select را می نویسیم و با علامت * می گوییم تمام داده ها را نمایش بده.
آرگومان دوم: می گوید داده های مربوط به جدول TBL_NAME را نمایش ده.
آرگومان سوم: به کار ما نمی آید و null می دهیم.
Cursor result=db.rawQuery(“select * from ” + TBL_NAME,null);
return result;
- و چون قراره اطلاعات ما به صورت یک لیست برگردد پس نتایج را داخل یک متغیر از نوع Cursor و با نام دلخواه result ذخیره می کنیم و در نهایت می گوییم مقدار result را برگردان.
تعریف تابع onClick دکمه “نمایش داده ها” و فراخوانیتابع Select در اکتیویتی NewPageActivity
این کلاس را جلسه قبل ایجاد کردیم و کامل لایوت و اکتیویتی آن را توضیح دادیم . حالا می خواهیم با فشردن دکمه “نمایش داده ها” تابع Select که در myDatabaseHelper نوشتیم، فراخوانی شود.شکل کلی تابع به صورت زیر است:
public void onBtnShowAllClick(View v){
//فراخوانی تابع Select
Cursor res=mydb.ShowallData();
//بررسی خالی بودن جدول
if(res.getCount()==0){
Toast.makeText(NewPageActivity.this,”جدول خالی بود”,Toast.LENGTH_LONG).show();
}
//ایجاد متغیر
StringBuffer data=new StringBuffer();
//گرفتن تمام داداه های داخل جدول
while (res.moveToNext()){
data.append(“ID:” + res.getString(0)+ “\n”);
data.append(“name:” + res.getString(1) + “\n”);
data.append(“Lastname” + res.getString(2) + “\n”);
}
//نمایش داده ها با دستور Alert
AlertDialog.Builder alert=new AlertDialog.Builder(this);
alert.setCancelable(true);
alert.setTitle(“نمایش داده ها”);
alert.setMessage(data.toString());
alert.show();
}
- یک تابع با نام onBtnShowAllClick (همان نامی که در layout برای onClick نوشتیم ) در کلاس NewPageActivity می نویسیم . یعنی وقتی دکمه “نمایش داده ها” کلیک شد این تابع اجرا شود.
public void onBtnShowAllClick(View v){
}
- یک شی با نام دلخواه mydb برای دسترسی به کلاس myDatabaseHelper در جلسه قبل ایجاد کردیم. با استفاده از این شی تابع ShowallData را فراخوانی می کنیم. مقدار برگشتی آن را درون یک متغیر با نام دلخواه res و از نوع Cursor می ریزیم.
Cursor res=mydb.ShowallData();
اگر جدول خالی بود
- با یک دستور if چک می کنیم که آیا داخل جدول اطلاعاتی هست یا خیر؟
if(res.getCount()==0){
Toast.makeText(NewPageActivity.this,“جدول خالی بود”,Toast.LENGTH_LONG).show();
}
نکته: با دستور getCount بررسی می کنیم که چقدر داده در res ذخیره شده است . اگر برابر 0 بود یعنی جدول خالی بود پس یک پیغام بده که جدول خالی بود.
نکته: دستور toast را قبلا کامل توضیح دادیم. آرگومان اول میگه پیغام را در کدام اکتیویتی چاپ کنم؟ آرگومان دوم میگه متن پیغام چیه؟ آرگومان سوم هم میگه چه مدت زمان نمایش دهد،طولانی یا کوتاه.
نکته: اگر ()show را ننویسید پیغام را نمایش نمی دهد.
اگر جدول خالی نبود
- در غیر این صورت یعنی جدول خالی نبود باید اطلاعات را نمایش دهد.
توجه: به سادگی نمیتوانیم متغیر Cursor را به Alert بدهیم تا چاپ کند برای همین یک متغیر با نام دلخواه data از نوع StringBuffer می سازیم . در ادامه به طور کامل متوجه خواهید شد.
- ابتدا یک شرط می گذاریم که تمام داده ها از ردیف اول تا آخر را برگرداند. برای این کار می گوییم تا زمانی که moveToNext (یعنی پرش به ردیف بعدی جدول) ،True هست. داده ها را بخوان و برگردان.
while (res.moveToNext()){
- گفتیم که برای نمایش اطلاعات باید داده ها را داخل متغیر از نوع StringBuffer بریزیم. برای این کار از تابع appent استفاده می کنیم.
تابع append یک ورودی از نوع int می خواهد که همان شماره ستون می باشد.
data.append(“ID:” + res.getString(0)+ “\n”);
نکته: برای اینکه کاربر متوجه شود این داده ها چی هستند قبل از نوشتن شماره ستون یک متن هم می نویسیم. تابع showallData فقط داده ها را برمی گرداند ولی مشخص نمی کند این داده آی دی است یا نام یا ….
- تا زمانی که حلقه while ما true می باشد یکی یکی ردیف ها را append می کند. مثلا اینجا برای داده های ردیف اول در نظر بگیرید:
کد زیر می گوید res داده موجود در ردیف اول و ستون اول جدول را بگیرد (ایندکس ستون اول 0 است) و قبلش مشخص کند که این داده ID می باشد و به متغیر StringBuffer بدهد.
data.append(“ID:” + res.getString(0)+ “\n”);
کد زیر می گوید res داده موجود در ردیف اول و ستون دوم را بگیرد (ایندکس ستون دوم1 است) و قبلش مشخص کند که این داده name می باشد و به متغیر StringBuffer بدهد.
data.append(“name:” + res.getString(1) + “\n”);
دوباره می گوییم res داده موجود در ردیف اول و ستون سوم را بگیرد( ایندکس ستون سوم 2 است ) و قبلش مشخص کند که این داده Lastname می باشد و به متغیر StringBuffer بدهد.
data.append(“Lastname” + res.getString(2) + “\n”);
نکته:n\ برای این است که به خط بعد برود.
این حلقه برای ردیف های بعد تکرار می شود تا زمانی که شرط while درست باشد.
چاپ اطلاعات
- حالا باید متغیر stringBuffer را به تابع Alert بدهیم تا چاپ کنیم. برای این کار ابتدا متغیری از نوع Aletr با نام دلخواه alert تعریف می کنیم:
AlertDialog.Builder alert=new AlertDialog.Builder(this);
Alert چند پارامتر دارد که باید تنظیم کنیم:
- با setCancelable پیغام توسط کاربر قابل cansel شدن می شود.
alert.setCancelable(true);
- با دستور setTitle عنوان پیغام را تعیین می کنیم.
alert.setTitle(“نمایش داده ها”);
- با دستور setMessage مشخص می کنیم چه چیزی نمایش دهد. متغیرdata که از نوع stringBuffer بود و اطلاعات جدول به صورت مرتب شده به آن append شد را به عنوان ورودی به alert می دهیم البته باید به string تبدیل شود.
alert.setMessage(data.toString());
- در نهایت این alert با دستور show نمایش داده می شود.
alert.show();
در ادامه کدهایی که در جلسه قبل در NewPageActivity نوشته بودیم تابع onBtnShowAllClick را اضافه کردیم .
اجرای برنامه
برنامه را اجرا کنید (طبق آموزش جلسه پنجم) و دکمه “نمایش داد ها” را بزنید. نتیجه در اجرای برنامه ما به صورت زیر است:
آموزش دستور select در دیتابیس SQLite اندروید به پایان رسید حالا به راحتی می توانید اطلاعات را اضافه ، حذف و آپدیت کنید و نتابج را ببیند. امیدواریم آموزش دیتابیس تا این حد پاسخگوی نیازهای شما باشد. اگر مبحثی در رابطه با دیتابیس هست که فکر می کنید نیاز به آموزش دارد در قسمت دیدگاه ها با ما در میان بگذارید.
لطفا سوالات و پیشنهادات خود را در قسمت دیدگاه ها، زیر همین آموزش با در میان بگذارید.
واااای چقدر خوب وکامل توضیح دادید…
خسته نباشید
سلام خسته نباشید
من میخوام همینو تو لیست ویو نمایش بدم اگه میشه کدشو برام نمایش بده
عالی بود – ممنون
سلام خسته نباشید
خیلی عالی بود
اگه میشه به عنوان قسمت بعدی ، نمایش همین جدول در ریسایکلرویو آموزش بدید
ممنون
سلام خسته نباشید من میخوام همین اطلاعات تو لیست ویو نمایش بدم ولی نمیدونم چطوری؟ ممنون میشم اگه راهنماییم کنین…
سلام خست نباشید
من میخوام همینو تو لیست ویو نمایش بدم باید چیکارکنم؟ ممنون میشم راهنماییم کنین…
سلام درستش کردی
سلام
میخام چندتا فایل صوتی رو با زدن دکمه ها از روی دیتابیس پخش کنم
امکان همچین کاری هست ؟
لطفا راهنمایی کنید .
سلام خسته نباشید. اگر بخواهیم طور مثال کاربر username و password رو وارد کنه که اندروید اول چک کنه دیتابیس رو و با توجه به اطلاعات وارد شده سایر مشخصات طرف را بهش نمایش بدهد.باید چیکار کنیم؟من واسه این کار هم از کلاس مدل هم از همین روش ذکر شده تو همین مثال و هم از intent ها استفاده کردم ولی جوابی نگرفتم ! ممنون میشم راه حلی ارایه کنید.
سلام و عرض ادب
ان شالله به زودی آموزشی در این رابطه ارائه خواهیم کرد.
با تشکر از همراهی شما
سلام من میخوام با دادن یک شماره تمامی اینها نمایش داده شود مثلا هرشماره مختص مشخصات یک نفر وشماره بعدی هم مختص مشخصات نفر بعدی ونفربعدی هم به همین ترتیب.میشه بگین چطوری میشه؟
سلام آموزشتون خیلی خوب و کامل بود خیلی متشکرم
الان میخواستم همین لیست که تو دیالوگ نشون میده رو تو ریسایکلر ویو نشون بده. میشه کدش رو بفرستید؟؟؟؟
سلام لطفا نحوه افزودن عکس به دیتابیس sqlite رو هم توضیح دهید
ممنون خیلی خوب بود واقعا همشو دوس داشتم. موفق باشین
سلام. ممنون از آموزش خوبتون
اگر بخواهیم به اطلاعات یک id خاص دسترسی پیدا کنیم، کدها چه تغیراتی می کنه؟
بعد از چند روز جست و جو جواب رو پیدا کردم. میگذارم برای کسایی که ممکنه این سوال بعدا براشون پیش بیاد.
این خط از برنامه اطلاعات کل دستابیس رو برمیگردونه:
Cursor result=db.rawQuery(“select * from ” + TBL_NAME,null);
باید به این صورت تغییرش داد:
String number = “3”;
Cursor result = db.rawQuery(“select * from ” + TBL_NAME+” where Id =?”, new String[]{number});
با این کد اطلاعات مربوط به خط ۳ رو بر می گردونه. البته در برنامه واقعی باید شماره خطی که میخواید بخونید رو از مثلا Main Activity به کلاس دیتا بیس بفرستید.
سلام و عرض خسته نباشید
من می خوام توی select از شرط استفاده کنم مثلا از یک اکتیویتی دیگه اطلاعاتی ارسال کنم به select و شرط بزارم، ممنون میشم اگه راهنمایی کنید