Como conectar MySQL con Android Nativo

En este tutorial, vamos a explicar, cómo se puede integrar PHP y MYSQL con su aplicación para Android. Esto es muy útil en caso de tener un servidor web, y desea acceder a sus datos en su aplicación para Android.

MYSQL se utiliza como base de datos en el servidor web y PHP se utiliza para obtener los datos de la base de datos. Nuestra aplicación se comunicará con la página PHP con los parámetros necesarios y PHP se comunicará con la base de datos MYSQL y obtendrá el resultado y devolver los resultados a nosotros.

PHP - MySQL


Creación de la base de datos

Base de datos MySQL se puede crear fácilmente con este simple script. El CREATE DATABASE sentencia crea la base de datos. (crearBD.php)

  
<?php
$con=mysqli_connect("localhost","root","123456");
$sql="CREATE DATABASE pruebaAndroid";
if (mysqli_query($con,$sql))
{
   echo "La base  pruebaAndroid fue creada con exito";
}else{
 echo "error al crear la base pruebaAndroid";
}
?>

Creación de tablas

Una vez creada la base de datos, es hora de crear algunas tablas de la base de datos. El CREATE TABLE sentencia crea la base de datos. (crearTablas.php)

  
<?php
$con=mysqli_connect("localhost","root","123456","pruebaAndroid");
$sql="CREATE TABLE usuario(usuario CHAR(30),clave CHAR(30),rol CHAR(30))";
if (mysqli_query($con,$sql))
{
   echo "La tabla ha sido creada con éxito";
}
?>

Inserción de valores en las tablas

Cuando se creó la base de datos y tablas. Ahora es el momento de introducir algunos datos en las tablas. La Insertar en sentencia crea la base de datos. (InsertarValoresTabla.php)

  
<?php
$con=mysqli_connect("localhost","root","123456","pruebaAndroid");
$sql="INSERT INTO usuario(usuario, clave, rol) VALUES ('admin', 'admin','administrador')";
if (mysqli_query($con,$sql))
{
   echo "Los valores se han insertado con éxito";
}
?>

Métodos GET y POST - PHP

PHP también se utiliza para buscar el registro de la base de datos mysql, una vez que se crea. Para a buscar récord alguna información debe ser transmitida a la página PHP con respecto a lo registró sea descabellada.

El primer método para pasar información es a través de método GET en el que $ _GET se utiliza comandos. Se pasan las variables en la url y el registro es descabellada. Su sintaxis es la siguiente - (metodoGet.php)

  
<?php
$con=mysqli_connect("localhost","root","123456","pruebaAndroid");
if (mysqli_connect_errno($con))
{
   echo "Error al conectar con MySQL: " . mysqli_connect_error();
}
$usuario = $_GET['usuario'];
$clave = $_GET['clave'];
$result = mysqli_query($con,"SELECT rol FROM usuario where usuario='$usuario' and clave='$clave'");
$row = mysqli_fetch_array($result);
$data = $row[0];

if($data){
 $arr = array('data' => $data);
}else{
 $arr = array('data' => "usuario no existe");
}
 echo json_encode($arr);
 
mysqli_close($con);
?>

El segundo método consiste en utilizar el método POST. El único cambio en el guión anterior es reemplazar $ _GET con $ _POST. En el método Post, las variables no se transmiten a través de la URL.

Android - MYSQL Conexión

Conexión a través Metodo

Hay dos maneras de conectarse a MySQL a través de la página PHP. La primera se llama método Get. Usaremos HttpGet y HttpClient clase conectar. Su sintaxis es la siguiente -

  
URL url = new URL(link);
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI(link));

Después de que usted tiene que llamar a ejecutar el método de HttpClient clase y recibirlo en un objeto HttpResponse. Después de que es necesario abrir las corrientes para recibir los datos.

  
URL url = new URL(link);
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI(link));
HttpResponse response = client.execute(request);

if(response.getStatusLine().getStatusCode() == 200){

   HttpEntity entity = response.getEntity();

  if (entity != null) {
     InputStream instream = entity.getContent();
     String result= convertStreamToString(instream);
     Log.d("result ****", String.valueOf((result)));
     json.put("response_", new JSONObject(result));
     instream.close();
 }
} else {
  Log.d("result **** error", String.valueOf((0)));
}

Conexión Vía método POST

En el método POST, el URLEncoder, URLConnection se utilizará clase. El URLEncoder codificará la información de las variables de paso. Se está dada sintaxis abajo -

  

URL url = new URL(link);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();


conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());

wr.write( data );
wr.flush();



// Check the connection status
if(conn.getResponseCode() == 200)
{
   // if response code = 200 ok
   InputStream in = new BufferedInputStream(conn.getInputStream());

   // Read the BufferedInputStream
   BufferedReader r = new BufferedReader(new InputStreamReader(in));
   StringBuilder sb = new StringBuilder();
   String line;
   while ((line = r.readLine()) != null) {
       sb.append(line);
   }
   stream = sb.toString();
   // End reading...............
   Log.d("result ****", String.valueOf((stream)));
   json.put("response_", new JSONObject(stream));
   // Disconnect the HttpURLConnection
   conn.disconnect();
}else{
   // Do something
}

La última cosa que necesita hacer es escribir estos datos al enlace. Después de la escritura, es necesario abrir la secuencia para recibir los datos respondido.

  
private static String convertStreamToString(InputStream is) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }

Ejemplo

El ejemplo siguiente es un ejemplo completo de la conexión de la aplicación para Android con la base de datos MySQL a través de la página PHP. Se crea una aplicación básica que le permite conectarse mediante GET y el método POST.

PHP - parte MYSQL

En este ejemplo una base de datos con el nombre de pruebaAndroid En esa base de datos, una tabla ha sido creada con el nombre de la pruebaAndroid . Esta tabla tiene tres campos. (Nombre de usuario, contraseña, Papel). La tabla tiene sólo un registro que es ("admin", "admin", "administrador").
La página php se ha dado por debajo del cual toma los parámetros por el método de entrada. (metodoPost.php)

  

<?php
$con=mysqli_connect("localhost","root","123456","pruebaAndroid");
if (mysqli_connect_errno($con))
{
   echo "Error al conectar con MySQL: " . mysqli_connect_error();
}
$usuario = $_POST['usuario'];
$clave = $_POST['clave'];
$result = mysqli_query($con,"SELECT rol FROM usuario where usuario='$usuario' and clave='$clave'");
$row = mysqli_fetch_array($result);
$data = $row[0];

if($data){
 $arr = array('data' => $data);
}else{
 $arr = array('data' => "usuario no existe");
}
 echo json_encode($arr);
mysqli_close($con);
?>

PHP - parte Android

Para experimentar con este ejemplo, es necesario ejecutar este en un dispositivo real en el que se conecta a internet wifi.

Lo primero que debemos hacer es crear un nuevo proyecto en Android Studio, al proyecto de damos un nombre para este caso yo lo llame (ejemplomysql).

Una vez escogemos el SDK mínimo, vamos a escoger el Activity (Blank Activity ) si no conoces los tipos de activity de recomiendo visitar esta pagina

Listo cuando ya tengamos creado nuestro nuevo proyecto listo para trabajar, lo que vamos hacer es unas modificaciones en nuestro 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=".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" >

        

    </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>

Para que no tengamos con las variables implementadas en el xml vamos a modificar también nuestro strings.xml, este lo puedes ubicar en app/res/values

 

<resources>
    <string name="app_name">pruebaBaseDatos</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>
    <string name="Username">Usuario</string>
    <string name="Password">Clave</string>
    <string name="LoginGet">Iniciar por Get</string>
    <string name="LoginPost">Iniciar por Post</string>
    <string name="App">Iniciar sesión</string>
    <string name="LoginStatus">sesión Status</string>
    <string name="LoginRole">Rol de la sesión</string>
    <string name="Status">No Inicio sesión</string>
    <string name="Role">No asignado</string>
    <string name="method">Metodo sesión</string>
    <string name="Choose">Escoger Metodo</string>

</resources>

Una vez listo nuestra interfaz solo nos queda darle vida, por eso vamos a modificar nuestro MainActivity.java

 
package android.ejemplo.com.ejemploMySQL;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
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);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    public void login(View view){
        String username = usernameField.getText().toString();
        String password = passwordField.getText().toString();
        method.setText("Get Metodo");
        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 Metodo");
        new SigninActivity(this,status,role,1).execute(username,password);
    }
}

Como podemos observar el código no arroja un error de una clase que no está creada (SigninActivity), creamos esta clase y colocamos el siguiente código.

 
package android.ejemplo.com.ejemploMySQL;

import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.TextView;

import org.apache.http.HttpEntity;
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 org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.net.URLEncoder;

public class SigninActivity  extends AsyncTask<String,Void,String>{
    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) {
        String stream = null;
        JSONObject json = new JSONObject();
        if(byGetOrPost == 0){ //means by Get Method

            try{
                String username = (String)arg0[0];
                String password = (String)arg0[1];
                String link = "http://10.200.12.169/hablemosDeAndroid/baseDatos/metodoGet.php?usuario="+username+"&clave="+password;

                URL url = new URL(link);
                HttpClient client = new DefaultHttpClient();
                HttpGet request = new HttpGet();
                request.setURI(new URI(link));
                HttpResponse response = client.execute(request);

                if(response.getStatusLine().getStatusCode() == 200){

                    HttpEntity entity = response.getEntity();

                    if (entity != null) {
                        InputStream instream = entity.getContent();
                        String result= convertStreamToString(instream);
                        Log.d("result ****", String.valueOf((result)));
                        json.put("response_", new JSONObject(result));
                        instream.close();
                    }

                } else {
                    Log.d("result **** error", String.valueOf((0)));
                }



                return String.valueOf(json);


            }

            catch(Exception e){
                return new String("Exception: " + e.getMessage());
            }
        }
        else{
            try{
                String username = (String)arg0[0];
                String password = (String)arg0[1];

                String link="http://10.200.12.169/hablemosDeAndroid/baseDatos/metodoPost.php";
                String data  = URLEncoder.encode("usuario", "UTF-8") + "=" + URLEncoder.encode(username, "UTF-8");
                data += "&" + URLEncoder.encode("clave", "UTF-8") + "=" + URLEncoder.encode(password, "UTF-8");

                URL url = new URL(link);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();


                conn.setDoOutput(true);
                OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());

                wr.write( data );
                wr.flush();



                // Check the connection status
                if(conn.getResponseCode() == 200)
                {
                    // if response code = 200 ok
                    InputStream in = new BufferedInputStream(conn.getInputStream());

                    // Read the BufferedInputStream
                    BufferedReader r = new BufferedReader(new InputStreamReader(in));
                    StringBuilder sb = new StringBuilder();
                    String line;
                    while ((line = r.readLine()) != null) {
                        sb.append(line);
                    }
                    stream = sb.toString();
                    // End reading...............
                    Log.d("result ****", String.valueOf((stream)));
                    json.put("response_", new JSONObject(stream));
                    // Disconnect the HttpURLConnection
                    conn.disconnect();

                }
                else
                {
                    // Do something
                }

                return String.valueOf(json);

            }
            catch(Exception e){
                return new String("Exception: " + e.getMessage());
            }
        }
    }

    @Override
    protected void onPostExecute(String result){
        this.statusField.setText("Entrar con éxito");

        String json_str = String.valueOf(result);
        try {
            JSONObject my_obj = new JSONObject(json_str);
            String response = my_obj.getString("response_");
            JSONObject response_ = new JSONObject(response);
            String data = response_.getString("data");
            Log.d("resultado", String.valueOf(data));
            this.roleField.setText(data);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    private static String convertStreamToString(InputStream is) {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
}

Ya solo nos falta darle permisos de internet a nustra aplicación para poder tener comunicación con MySQl por eso en el contenido del AndroidManifest.xml.

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="android.ejemplo.com.ejemploMySQL" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Vamos a tratar de ejecutar la aplicación ejemploMySQL. Supongo que ha conectado su dispositivo móvil Android real con el ordenador. Para ejecutar la aplicación desde Android Studio, uno abierto de archivos de la actividad de su proyecto y haga clic en Ejecutar Icono de la barra de herramientas. Antes de iniciar su aplicación, Android Studio mostrará la siguiente ventana para seleccionar una opción en la que desea ejecutar la aplicación Android.

Seleccione su dispositivo móvil como una opción y luego verifique su dispositivo móvil que mostrará siguiente pantalla -

Ahora sólo tiene que escribir su nombre de usuario y contraseña. En mi caso yo estoy escribiendo admin como nombre de usuario y contraseña. Se muestra en la figura -

Ahora pulse el botón Obtener y espere unos segundos y la respuesta se descargará y se mostrará a usted. En este caso, la respuesta es el papel que se recupera en el caso de admin como nombre de usuario y password.It se muestra en la figura siguiente -

Ahora, de nuevo, pulse aparecerían el botón POST y mismo resultado.

Les dejo un vídeo y el código para que puedan trabajar este tutorial. no olviden comentar.

URL DE DESCARGA ejemplomysql

Video

Comentarios

Publicar un comentario

Gracias por compartir tus comentarios con nosotros, si el comentario requiere de alguna respuesta por parte de nosotros, trataremos de responderte lo mas pronto posible.

Entradas populares de este blog

Lista con imágenes Android nativo (ListView)

SUMAR RESTAR HORAS DÍAS EN ANDROID