martes, 6 de junio de 2017

Tutorial
¿Cómo hacer un registro de usuarios con una base de datos remota?

Introducción: 
Muchas aplicaciones necesitan un registro de usuarios para poder hacer un login. Cuando se está desarrollando una aplicación podemos en este caso utilizar para el registro de usuarios dos variantes sobre la base de datos. La primera es implementar la base de datos en local. Para ello podemos utilizar SQLite. Pero esto no es lo normal. Lo normal es que tengamos un servidor de base de datos dedicado, y al que nos conectamos de forma remota. Por tanto en este tutorial vamos a ver cómo conectarse con un servidor remotamente. Para ello vamos a utilizar una librería que nos permite hacer peticiones HTTP. Esta se llama Volley y en el siguiente enlace podemos ver que podemos hacer con esta librería:


Preparando nuestro proyecto:
Lo primero que debemos hacer es incluir nuestra librería dentro de nuestro proyecto. Para ello vamos a incluir la siguiente línea en el fichero build.gradle (Module: app):

compile 'com.android.volley:volley:1.0.0'

Con esta línea ya tenemos incluida la librería en nuestro proyecto, pero todavía no está todo listo. Hace falta sincronizar, nos aparecerá el siguiente mensaje y le damos a sincronizar. Una vez hecho esto ya estará listo todo para utilizarla.


Preparando el servidor:
Debemos elegir un hosting que nos permita crear base de datos. Necesitamos para cada acción que vayamos realizar sobre la base de datos crear scripts en PHP, para poder interactuar con ellos. Una vez que tengamos un servidor listo debemos de hacer un script en PHP para la conexión. Este, por ejemplo, lo vamos a llamar connect_db.php. Y que tenemos otro que por ejemplo hace el registro básico de un usuario, llamado alta_usuario.php.

Fichero connect_db.php

<?php
//Establecer conexion sobre la base de datos y seleccionar esta
$conexion = mysqli_connect('ip_servidor','root','pass') or die("No se puede conectar a la BD.");
mysqli_set_charset($conexion, 'utf8');
mysqli_select_db($conexion, "nombre_BD") or die("No se puede acceder a la BD.");
return $conexion;
?>

Fichero alta_usuario.php

<?php
//script para dar de alta un usuario
//Recibimos los datos del formulario
$nombre = $_POST['nombre'];
$email = $_POST['correo'];
$pass = $_POST['password'];
$con = require("connect_db.php"); //Abrir conexion con la base de datos
//Sentencia SQL
$query = "INSERT INTO usuarios (nombre,email,password) VALUES ('$nombre','$email','$pass')";
$query2 = "SELECT * FROM usuarios WHERE email='$email'";
$result = mysqli_query($con, $query2);
if($row = mysqli_fetch_array($result)){
echo "Ya hay un usuario registrado con el mismo email";
} else {
if (mysqli_query($con, $query)){
echo "Registrado Correctamente";
}
else{
echo "No se ha podido registrar";
}
}
// liberar la serie de resultados
mysqli_free_result($result);
//Cerrar la conexion
mysqli_close($con);
?>

Creando la activity:
Creamos la activity con: 3 EditText y un Button. En el fichero Java de la activity, recogemos los 4 elementos dichos anteriormente. Creamos una función por ejemplo llamada registrarUsuario(). Esta función la llamaremos desde el onClick() del botón.

Función registrarUsuario()

private void registrarUsuario(){
final String username = user.getText().toString().trim();
final String email = ema.getText().toString().trim();
final String password = pass.getText().toString().trim();
final String REGISTER_URL = htttp://www.miservidor.com/alta_usuario.php;
if (username.equals("") || email.equals("") || password.equals("")){
Toast.makeText(getApplicationContext(), "Algún campo está vacio", Toast.LENGTH_LONG).show();
Intent intent = new Intent(getApplicationContext(), RegisterActivity.class);
finish();
startActivity(intent);
} else {
StringRequest stringRequest = new StringRequest(Request.Method.POST, REGISTER_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(), "No hay conexion", Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("nombre", username);
params.put("correo", email);
params.put("password", password);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
}

En primer lugar extraemos el contenido de los EditText con el método toString(). Definimos al principio de la función, una variable para guardar la url. Esta url es la de nuestro servidor llamando al script de registro. En nuestro ejemplo: htttp://www.miservidor.com/alta_usuario.php

Con una sentencia condicional vemos si los campos están vacíos. Si algún campo está vacío se le manda un mensaje al usuario y se le manada de nuevo a la activity de registro. Si todos los campos contienen valores entonces creamos un StringRequest. Como vemos en la función, debemos definir si los datos los vamos a pasar con el método GET o POST. La url, y dos llamadas a Response. La primera es para gestionar la respuesta correcta del servidor. Es decir, lo que queramos hacer si la acción en el servidor se ha hecho correctamente lo colocamos dentro de esta llamada. La otra, como se puede apreciar, para que hacer en caso de que el servidor devuelve error.

getParams(), este método como se puede ver crea un map con pares clave/valor. Pues bien, este map es el que se le “envía” al script en PHP. Los nombres de las variables que reciben el valor en el script deben de ser los mismos nombres clave del map. Por último, le decimos a Volley que ejecute el StringRequest. Y por último si queremos que haga alguna acción después de esta función. Pues lo incluimos en el método del botón.

Con esto ya tenemos hecho un registro de usuarios básico con una base de datos remota. Cuando hagamos test, veremos que cuando el móvil no tiene conexión a internet veremos un mensaje de Volley diciendo que no hay conexión. Siempre hay que tener claro, qué nombres hay en los campos de la base de datos y en el script. Para no tener problemas.

No hay comentarios:

Publicar un comentario

Tutorial Trabajando con un Adaptador en Android Introducción: Dentro de Android tenemos un objeto llamado Adapter. Un adaptador se de...