آموزش اتصال به دیتابیس Mysql در اندروید
سلام دوستان در این سری از آموزش ها , آموزش اتصال به دیتابیس Mysql در اندروید را می خواهیم به شما آموزش دهیم و دلایل استفاده از دیتابیس شاید می توان گفت بی شمار باشد یکی از آنها خواندن دیتاست شاید بیشترین کاری که می توان با یک دیتابیس انجام داد خواندن و افزوردن (insert) است در ادامه ما بخش های مختلف آن را بررسی می کنیم در ادامه با ما همراه باشید.
قبل از هر کاری ما باید یک دیتابیس ایجاد کنیم این کار را می توانیم به صورت دست دستی یا با کد زیر انجام دهیم.
1 2 3 4 5 6 7 | <?php $con=mysqli_connect("example.com","username","password"); $sql="CREATE DATABASE my_db"; if (mysqli_query($con,$sql)) { echo "Database my_db created successfully"; } ?> |
در بالا فکر نمی کنم نیاز به توضیح داشته باشد باید اسم سایت و نام و پسورد دیتابیس رو قرار دهیم و بعد از آن باید یک دیتابیس ایجاد کنیم my_db هم نام دیتابیس ماست و بررسی می کنیم ایا وصل می شود اگر وصل شود پیام برای شما چاپ می شود در غیر این صورت چیزی نمایش داده نمی شود.
بعد از آن , زمان ایجاد جدول ها (table) های ما است این کار رو هم همانند کار قبل می توانید به صورت دستی یا با استفاده از کد زیر انجام دهید.
1 2 3 4 5 6 7 | <?php $con=mysqli_connect("example.com","username","password","my_db"); $sql="CREATE TABLE table1(Username CHAR(30),Password CHAR(30),Role CHAR(30))"; if (mysqli_query($con,$sql)) { echo "Table have been created successfully"; } ?> |
در بالا هم برای ایجاد جدول query ما یا همان sql ما به این شکل می شود که یک جدول به نام table1 ایجاد کرده سپس یک فیلد به نام username از نوع char و طول 30 و یک فیلد به نام پسورد از نوع char و به طول 30 و الی آخر.
1 2 3 4 5 6 7 | <?php $con=mysqli_connect("example.com","username","password","my_db"); $sql="INSERT INTO table1 (Username, Password, Role) VALUES ('admin', 'admin','adminstrator')"; if (mysqli_query($con,$sql)) { echo "Values have been inserted successfully"; } ?> |
برای افزودن یا (insert) کردن از کد بالا استفاده می شود یعنی در فیلد username , lastname , age به ترتیب دیتا های admin , admin , administrator اضافه می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php $con=mysqli_connect("example.com","username","password","my_db"); if (mysqli_connect_errno($con)) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } $username = $_GET['username']; $password = $_GET['password']; $result = mysqli_query($con,"SELECT Role FROM table1 where Username='$username' and Password='$password'"); $row = mysqli_fetch_array($result); $data = $row[0]; if($data){ echo $data; } mysqli_close($con); ?> |
برای اینکه بیایم و دیتابیس رو بخونیم از متد Get استفاده می کنیم در بالا مقدار فیلد های username و passwrod در دو متغیر به همان نام ذخیره می شود . سپس ما نتیجه را در یک متغییر به نام result ذخیره می کنیم و میاد انتخاب می کنه فیلد role رو از جدول tabel1 در جایی که username برابر با همان username که در ابتدا گرفتیم و همینطور فیلد پسورد رو. سپس این آرایه را fetch می کنیم و در متغیر row قرار می دهیم و برای به دست اوردن هر ردیف کافی است شماره آن ردیف را بنویسیم و از صفر هم شروع می شود و در آخر ان دیتا را چاپ می کنیم.
شاید تا اینجا خسته شده باشید 🙂 حال به سراغ بخش اندروید می رویم یعنی اتصال mysql به اندروید دوستان یه چیز رو یادم رفت اولش بگم راحترین شکل اتصال به دیتابیس از طریق php است اگر این راه را نخواهید برید باید کلی کلاس و کد های اضافی برای اتصال بنویسید و سبب افزایش حجم برنامه هم می شود.
دو روش برای اتصال به android به php برای خواندن mysql هست اولین روش :
متد Get
برای این کار از HttpGet و HttpClinet استفاده می کنیم
1 2 3 4 | URL url = new URL("example.com"); HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(); request.setURI(new URI("example.com")); |
بعد از اجرای کد بالا حال نیاز داریم تا یک شی از HttpReponse ایجاد کرده تا دیتا را توسط آن مدیریت کنیم به زبان ساده برای دریافت دیتا از HttpResponse استفاده می شود.
روش دوم متد Post
1 2 3 4 5 6 | URL url = new URL("example.com"); String data = URLEncoder.encode("username", "UTF-8") + "=" + URLEncoder.encode(username, "UTF-8"); data += "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(password, "UTF-8"); URLConnection conn = url.openConnection(); |
در این روش از URLEncoder,URLConnection استفاده میکنیم urlencoder اطالاعات را encode کرده و URLConnection ارتباط مورد نیاز را برقرار می کند کار کد بالا به زبان ساده این است که مقدار فیلد username و password را میگیرد.
شاید یکم گیج شده باشید ولی اشکالی ندارد ما درپایین یک مثال جامع استفاده از دیتابیس رو میزنیم تا بیشر آشنا بشید.
فایل MainActivity به شکل زیر می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { private EditText usernameField,passwordField; private TextView status,role,method; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); usernameField = (EditText)findViewById(R.id.editText1); passwordField = (EditText)findViewById(R.id.editText2); status = (TextView)findViewById(R.id.textView6); role = (TextView)findViewById(R.id.textView7); method = (TextView)findViewById(R.id.textView9); } public void login(View view){ String username = usernameField.getText().toString(); String password = passwordField.getText().toString(); method.setText("Get Method"); new SigninActivity(this,status,role,0).execute(username,password); } public void loginPost(View view){ String username = usernameField.getText().toString(); String password = passwordField.getText().toString(); method.setText("Post Method"); new SigninActivity(this,status,role,1).execute(username,password); } } |
کد بالا نیاز به توضیح آنچنانی ندارد فقط چند EditText داریم که مقدار آنها رو دریافت می کنیم و دو void داریم که یکیش برای تست ورود و دومی هم برای همین کار است فقط با متد Post است.
کلاس SigninActivity ایجاد کرده سپس کد زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import android.content.Context; import android.os.AsyncTask; import android.widget.TextView; public class SigninActivity extends AsyncTask{ private TextView statusField,roleField; private Context context; private int byGetOrPost = 0; //flag 0 means get and 1 means post.(By default it is get.) public SigninActivity(Context context,TextView statusField,TextView roleField,int flag) { this.context = context; this.statusField = statusField; this.roleField = roleField; byGetOrPost = flag; } protected void onPreExecute(){ } @Override protected String doInBackground(String... arg0) { if(byGetOrPost == 0){ //means by Get Method try{ String username = (String)arg0[0]; String password = (String)arg0[1]; String link = "http://myphpmysqlweb.hostei.com/login.php?username="+username+"& password="+password; URL url = new URL(link); HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(); request.setURI(new URI(link)); HttpResponse response = client.execute(request); BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line=""; while ((line = in.readLine()) != null) { sb.append(line); break; } in.close(); return sb.toString(); } catch(Exception e){ return new String("Exception: " + e.getMessage()); } } else{ try{ String username = (String)arg0[0]; String password = (String)arg0[1]; String link="http://myphpmysqlweb.hostei.com/loginpost.php"; String data = URLEncoder.encode("username", "UTF-8") + "=" + URLEncoder.encode(username, "UTF-8"); data += "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(password, "UTF-8"); URL url = new URL(link); URLConnection conn = url.openConnection(); conn.setDoOutput(true); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write( data ); wr.flush(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); StringBuilder sb = new StringBuilder(); String line = null; // Read Server Response while((line = reader.readLine()) != null) { sb.append(line); break; } return sb.toString(); } catch(Exception e){ return new String("Exception: " + e.getMessage()); } } } @Override protected void onPostExecute(String result){ this.statusField.setText("Login Successful"); this.roleField.setText(result); } } |
کد بالا ممکن است یکسری کلاس هایی دارد که به طور معمول در اندروید وجود ندارد فایل Build.Gradle را باز کرده و خط زیر را به آن اضافه کنید.دوستان کد زیر رو از هیچ سایت ایرانی و یا خارجی نمی تونید پیدا کنید حتما از همین خط زیر استفاده کنید هم حجمش حدودا 3 کیلیوبایت است هم خیلی کاربردی است.
1 | compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2' |
layout بخش activity_main.xml هم همانند زیر ایجاد کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | <?xml version="1.0" encoding="utf-8"?> <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=".MainActivity" > <EditText android:id="@+id/editText2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/editText1" android:layout_below="@+id/editText1" android:layout_marginTop="25dp" android:ems="10" android:inputType="textPassword" > </EditText> <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginTop="44dp" android:ems="10" > <requestFocus android:layout_width="wrap_content" /> </EditText> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/editText1" android:layout_alignParentLeft="true" android:text="@string/Username" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="@string/App" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/textView7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/textView5" android:layout_alignLeft="@+id/textView6" android:text="@string/Role" android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="10sp" /> <TextView android:id="@+id/textView5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView6" android:layout_marginTop="27dp" android:layout_toLeftOf="@+id/editText1" android:text="@string/LoginRole" /> <TextView android:id="@+id/textView8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/textView6" android:layout_alignLeft="@+id/textView5" android:layout_marginBottom="27dp" android:text="@string/method" /> <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView8" android:layout_below="@+id/button1" android:layout_marginTop="86dp" android:text="@string/LoginStatus" /> <TextView android:id="@+id/textView6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/textView4" android:layout_centerHorizontal="true" android:text="@string/Status" android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="10sp" /> <TextView android:id="@+id/textView9" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/textView8" android:layout_alignLeft="@+id/textView6" android:text="@string/Choose" android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="10sp" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toRightOf="@+id/textView6" android:onClick="loginPost" android:text="@string/LoginPost" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/button2" android:layout_alignBottom="@+id/button2" android:layout_alignLeft="@+id/textView2" android:onClick="login" android:text="@string/LoginGet" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/editText2" android:layout_alignBottom="@+id/editText2" android:layout_alignParentLeft="true" android:text="@string/Password" /> </RelativeLayout> |
از بخش res > layout >values > string.xml را باز کرده وکد های زیر را به آن اضافه کنید.
1 2 3 4 5 6 7 8 9 10 11 | <string name="Username">Username</string> <string name="Password">Password</string> <string name="LoginGet">Login - Get</string> <string name="LoginPost">Login - Post</string> <string name="App">Login Application</string> <string name="LoginStatus">Login Status</string> <string name="LoginRole">Login Role</string> <string name="Status">Not login</string> <string name="Role">Not assigned</string> <string name="method">Login Method</string> <string name="Choose">Choose Method</string> |
چون ما داریم با اینترنت کار می کنیم باید دسترسی یا همان Permission را در بخش AndroidManifest اضافه کنیم پس خط های زیر را به آن بی افزایید.
1 2 | <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> |
تمام شد آموزش خیلی کامل بود 🙂 ولی نیاز به این داشت که شما حداقل قبلا یک بار با php کار کرده بودید در آینده سعی می کنیم مبحث های php را هم برای عزیزان اضافه کنیم تا راحت تر متوجه شوید انشاالله آموزش براتون مفید بوده باشد.
موفق باشید.
با سلام
اون قسمتی که اومدیم از دیتابیس بخونیم و فیلدهای یوزر نیم و پسورد رو در متغیری به همون نام ذخیره کردیم. موقع تست به هرد ایراد میگیره در حالیکه طبق کدهای شما پیش رفتم
Notice: Undefined index: username in F:\XAMPP.7.1.2.Portable\xampp\htdocs\DatabaseManager_programchi\DatabaseManager.php on line 28
Notice: Undefined index: password in F:\XAMPP.7.1.2.Portable\xampp\htdocs\DatabaseManager_programchi\DatabaseManager.php on line 29
سلام بخشی از آموزش مشکل داشت خیلی ممنون که با خبرمان کردید هم اکنون آموزش را دوباره بررسی کنید بخشی که شما فرومدید مشکل ندارد شما باید به آن فایل یک post انجام دهید مثلا شما دارید در xampp این کار رو می کنید مثل زیر می شود.
به جای test.php نام فایل خودتان را قرار دهید (DatabaseManager.php)
موفق باشید.
خیلی خسته شدین خسته نباشید
کاملا از سایت stackoverflow کپی شده 😐
مطالب سایت از جایی کپی نمیشن و وقت زیادی برای توضیحات قرار داده میشن..برای کد ها فکر نمیکنم نیاز باشه توضیحی بدم..کد ها مشخص هستند…موفق باشید
آقای محمد حسین جعفری پور خدا خیرت بده
خیلی کارت درسته خیلی عالی هستی و اینکه فوق العاده اموزش میدی
$username = $_GET[‘username’];
$password = $_GET[‘password’];
این خط ارور داره localhost ارور میده . اگه میشد یه گروه تلگرام داشتید سوالات اونجا مطرح میشد خیلی خوب بود . اونجا شاید زودتر به جواب می رسیدیم. بازم تشکر
سلام . من با روش مشابه این، یک دیکشنری آندروید ساختم ولی سرعت اجرای query خیلی پایینه. هرچقدرمی گردم علت مشکل رو نمی تونم پیدا کنم. تعداد کلمه هاش 25000 تاست. به نظر شما مشکل از چی میتونه باشه؟