آموزش اتصال اپلیکیشن اندروید به SQL Server به طور مستقیم (قسمت دوم)

در آموزش قبلی به شما نحوه درست کردن Connection Class برای اتصال اپلیکیشن اندرویدیتون به SQL Server و درست کردن پورت خاص برای اون رو به شما آموزش دادیم. در این قسمت قصد داریم که به شما نحوه درست کردن فرم لاگین رو آموزش بدیم.

این برنامه دارای دو اکتویتی می‌باشد که اکتیوییتی دوم برای Insert کردن هستش و در آموزش بعد به آن میپردازیم. اکتیویتی اول که همان MainActivity می‌باشد یک Progress Bar، دوتا EditText، دوتا TextView برای معرفی EditText ها و دوتا Button برای ورود به صفحه بعدی و خروج از برنامه دارد.

SQL Server در اندروید

بخش دوم آموزش sql server در اندروید

خب در کلاس MainActivity در کنار تعریف کردن EditText و بقیه چیزها به صورت global یعنی در قسمت کلاس و بالای تابع onCreate باید یک String به نام rsString تعریف کنید که کاربردش رو جلوتر خواهید دید و بعد از اون باید بنویسید ConnectionClass connectionClass; و در ابتدای قسمت onCreate بنویسید connectionClass = new ConnectionClass(); . همانطور که خودتون میدونید این دو خط کد برای استفاده از کلاس کانکشن شما که در آموزش قبلی اونو درست کردید در MainActivity نوشته میشه. بعد از آن در همون قسمت یعنی onCreate بنویسید pbbar.setVisibility(View.GONE) تا ProgessBar شما پنهان شود. pbbar اسم ProgressBar تعریف شده است.

ما برای لاگین کردن در sql server از کلاس AsyncTask استفاده می‌کنیم. AsyncTask چیه؟ AsyncTask فقط برای کارهایی استفاده میشه که چند ثانیه وقت میبرن مثل لاگین کردن یا اینزرت کردن یا کارهایی مثل این. در واقع به اپلیکیشن اندروید ما کمک میکنه که کارهایی که می‌خوایم اپلیکیشن انجام بده از Main Thread جدا بشه و اونا رو جداگانه انجام بده که باعث کند شدن برنامه نشه و نتیجه‌ی کار رو روی UI Thread نشون بده بدون اینکه روی Main Thread اثری بذاره.

خب بعد از تابع onCreate باید بنویسید public class DoLogin extends AsyncTask <String,String,String>. من اسم کلاس رو DoLogin گذاشتم شما هر اسمی که دوست دارید می‌تونید بذارید. شما بعد از نوشتن کد بالا با یه خطا روبرو میشید. AsyncTask یک سری Implement methods داره که باید تعریف بشه یکی از اون ها doinBackground هست که خود اندروید استودیو در قسمت پیشنهادهای رفع ارورش اون رو برای شما تعریف میکنه. این متد اصلی ما هست و همانطور که از اسمش پیداس دستورات وارد شده در این قسمت در background و در کنار Main Thread انجام میشه. از دو متد onPreExecute و onPostExecute نیز استفاده میشه که اونو خودتون باید بنویسید. از اسم این دو متد مشخص هستش که یکی مربوط به قبل از انجام کار AsyncTask هست و اون یکی مربوط به بعد از انجام کار هست.

بعد از انجام این کارها در همون ابتدای کلاس AsyncTask و بالای همه متدهای تعریف شده باید یک String به نام z تعریف کنید و اون رو برابر با ” ” قرار بدید. یک Boolean به نام isSuccess تعریف کنید و اون رو برابر با false بذارید. کاربردهای این String و Boolean رو جلوتر می‌بینید و درک می‌کنید. سپس دو String با نام‌های username و password رو درست کنید. مقدار String username رو برابر با edtusername.getText().toString() بذارید و مقدار String password رو برابر با edtpass.getText().toString بذارید. همانطور که مشاهده می‌کنید مقدار این دو String مقدار EditText های شما هستش که تعریف کردید و توسط کاربر به اونا مقدار داده میشه و تبدیل به String میشه. دقت کنید که edtusername و edtpass اسم EditText ها هست و برای شما ممکنه که متفاوت باشه.

در قسمت onPreExecute باید بنویسید pbbar.setVisibility(View.Visible) تا ProgressBar شما به نمایش دربیاد. دقت کنید که pbbar اسم ProgressBar من هست که تعریفش کردم برای شما متفاوت هستش. در ابتدای قسمت onPostExecute باید کاری کنید که ProgressBar دیده نشه پس باید بنویسید pbbar.setVisibility(View.Gone). بعد باید از Toast استفاده کنید برای نشان دادن عملیات به کاربر یعنی به عنوان مثال وقتی کاربر وارد شد یک Toast ببینه که میگه خوش آمدید یا چیزهای دیگه پس باید بنویسید Toast.makeText(MainActivity.this, r, Toas.LENGTH_SHORT).show(); یک  Toast دیگه هم با شرط isSuccess باید بنویسید. علت این که این Toastها رو در داخل متد doInBackground تعریف نکردیم این است که باید از UI Thread فراخوانی بشن پس در این متد از آنها استفاده می‌کنیم و در doInBackground با استفاده از String z که بالاتر تعریفش کردیم به آنها مقدار میدیم.

تعریف کلاس DoLogin

خب حالا نوبت متد اصلی یعنی doInBackground می‌رسه. تو این متد در ابتدا اولین کاری که باید بکنیم این هستش که چک کنیم مقدار EditTextها خالی نباشه پس باید از همون Stringها که قبلا مقدار EditTextهارو بهش دادیم استفاده کنیم. پس باید بنویسیم if(username.trim().equals(“”) || password.trim().equals(“”)) در قسمت جواب شرط باید String z رو که قبلا تعریف کردیم رو مقدار دهی کنیم و اون رو برابر با “لطفا نام کاربری و رمزعبور خود را وارد کنید” بذارید. خب این شرط ما یک else هم داره که اگر کاربر username و password رو وارد کرد برنامه اون قسمت رو باید اجرا بکنه. در قسمت else باید یک try/catch بنویسیم که کد اصلی رو درون اون بنویسیم.  بعد از تعریف کردن try/catch در ابتدا در قسمت catch مقدار isSuccess رو برابر با false بذارید و برای دریافت ارور مقدار z رو برابر با ex.getMessage() بذارید. در قسمت try ابتدا باید بنویسید Connection con = connectionClass.CONN() تا اون مقدار تابع CONN که در کلاس Connection در آموزش قبلی برگردوندیم اینجا استفاده کنیم. حالا باید ببینیم این مقدار con خالی نباشد و پرباشد در واقع باید چک کنیم که کانکشن ما برقرار شده باشد پس باید بنویسیم if(con == null) و در جواب شرط باز باید z رو مقدار دهی کنیم و مقدار اون رو برابر با “خطا در برقراری ارتباط با سرور” بذاریم. این شرط ما یک نقیض یا همون else هم داره برای حالتی که کانکشن برقرار شده باشه در قسمت else این شرط باید ابتدا String به نام query تعریف کنیم. مقدار این String رو باید برابر با کوئری مورد نیازمون بذاریم. کوئری به این شکل هستش که password مربوط به username وارد شده رو از جدول دیتابیس برداشته و با password وارد شده مقایسه میکنیم تا درست باشه. از اونجا که usernameها منحصر به فرد یا همون unique هستن بنابراین مشکلی از این نظر که دو password برای یک username باشد پیش نمیاد. Password شما در دیتابیس دو حالت ممکن است داشته باشد password یا به صورت عادی ذخیره شده است یا به صورت رمزگذاری شده. در صورتی که password به شکل عادی ذخیره شده باشد کوئری به صورت “SELECT Password FROM your table WHERE Username=’” + username + “’” خواهد شد. Password نوشته شد در کوئری اسم ستون شما در دیتابیس هست. your table در واقع جدولی هست که شما با اون سر و کار دارید و Username هم باز ستون شما در دیتابیس هست که مقدارش رو از کاربر میگیره. حال اگر password شما رمزگذاری شده باشد کوئری به صورت “SELECT dbo.Decrypte(Password) AS Pass FROM your table WHERE Username=’” + username + “’” خواهد شد. کار dbo.Decrypte() این هست که مشخصات ستون Password رو میگیره اون رو رمزنگاری میکنه و به عنوان Pass اون رو نگه میداره. دیتابیسی که تو این آموزش استفاده میشه رمزگذاری شده هستش پس من از کوئری رمزنگاری استفاده می‌کنیم. بعد از نوشتن کوئری باید شیء به نام Statement درست کنید. این شیء در واقع رابطی هستش که نماینده یک SQL Statement هست. با اجرا کردن این شیء ما یک ResultSet دریافت می‌کنیم که درون اون مقدارهایی که از طریق کوئری بدست اومده رو ذخیره می‌کنیم. پس برای درست کردن Statement باید بنویسیم Statement stmt = con.createStatement. این شیء از طریق کانکشن ما درست میشه. بعد از اون باید ResultSet رو تعریف کنیم تا مقدارهای مورد نظر رو درون اون بریزیم. پس باید بنویسیم ResultSet rs = stmt.executeQuery() و در داخل پرانتز query رو می‌نویسیم تا کوئری ما با استفاده از Statement تعریف شده اجرا بشه و مقداری که برمیگردونه درون ResultSet ذخیره بشه.

متد doinBackground

حال باید بنویسیم if(rs.next()). اما کار rs.next() چیه؟ دستور .next() در واقع cursor رو به ردیف بعدی دیتابیس میبره و اگر ردیف بعدی وجود داشت مقدار true رو برمیگردونه و درغیراینصورت مقدار false رو برمیگردونه. هنگامی که این دستور در if قرار میگیره این معنی رو میگیره که باید چک بشود که در دیتابیس ردیفی وجود داره یا نه در واقع ما فقط ردیف اول رو چک می‌کنیم که جدول ما خالی نباشه. در جواب شرط باید rsString رو که اول کار تعریف کردیم مقدار دهی کنیم. مقدار اون رو باید برابر با rs.getString(“Pass”) بذاریم اگر از کوئری رمزنگاری استفاده نمی‌کنید باید جای Pass اسم ستون مورد نظرتون تو دیتابیس بذارید که مثلا تو این مورد Password هست سپس باید درون همین if بنویسید if(password.equals(rsString) تا برابر بودن password درون دیتابیس با password وارد شده بررسی بشه و در قسمت جواب شرط باید  به z مقدار “خوش آمدید” بدید و isSuccess رو برابر با true بذارید سپس یک Intetnt تعریف کنید تا به اکتیویتی Insert برود. بعد باید برای همین شرط یک else بنویسید که درون اون مقدار z رو برابر با “رمز عبور اشتباه است” میذاریم و isSuccess رو برابر با false میذاریم. این شرط rs.next() یه else هم دارد که درون اون قسمت باید به z مقدار “نام کاربری وجود ندارد” رو بدهیم و isSuccess رو برابر با false بذارید.

در آخر هم تابع ما باید مقداری برگردونه که اون مقدار z هست پس بعد از تموم شدن else مربوط به چک کردن خالی نبودن EditText های username و password باید return z رو بنویسید.

ادامه doInBackground

بعد از اتمام کار متد doInBackground در قسمت onCreate برای Button های خودتون onClickListener تعریف کنید. در قسمت Button ورود باید از DoLogin استفاده کنید و اون رو اجرا کنید. پس باید بنویسید DoLogin dologin = new DoLogin() سپس بنویسید dologin.execute() تا اجرا شود. در قسمت Button خروج باید کاری کنید که برنامه به طور کامل بسته شود. برای اینکار باز از Intent استفاده می‌کنیم پس باید بنویسید Intent hi = new Intent(Intent.Action_Main) بعد برای اون یک کتگوری به این صورت تعریف کنید بنویسید hi.addCategory(Intent.CATEGORY_HOME) بعد براش باید فلگ تعریف کنید پس بنویسید hi.setFlag(Intetnt.Flag_Activity_Clear_TOP) و در آخر برای شروع کار کردن این Intent بنویسید startActivity(hi).

دستورات onCreate

خب کد لاگین شما تموم شد! در آموزش بعدی که آموزش آخر این مجموعه هست INSERT رو به شما آموزش میدیم و همینطور با کوئری SELECT یک سری دیتا رو در TextView به نمایش میذاریم.

مهدیار مهتدی
مهديار مهتدي هستم. سه ساله كه به صورت فريلنسر روی برنامه نويسي اندرويد كار مي كنم. رشتم مكانيكه ولي در كنارش كاراي الكترونيكي هم دوست دارم و انجامش ميدم.😁
دیدگاه ها

ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

صفحه اینستاگرام کانال تلگرام