como registrar dos tablas relacionadas en android studio y mysql

Hola amig@s el dia de ayer revise la bandeja y encontré 45 correos donde preguntaban sobre:  
como registrar dos tablas relacionadas en android studio y mysql
Y lo que me comentan es que hay miles de tutoriales en SQLite, pero nada en Mysql. Entonces les echare una mano. Todo programador al estar en un proyecto llega al punto de que tiene que trabajar con dos o mas tablas relacionadas y las benditas foreign key(claves foráneas), entonces les comento que no hay nada mágico, tu web services es lo que cambia. En android se envía los atributos como siempre por POST no hay nada nuevo, en nuestra webservices hay que hacer una consulta, para obtener el id y luego insertarla en nuestra tabla relacionada.
Hay varias forma de extraer el id de registro, pero hoy haremos con una, las otras la averiguan por su cuenta.

Y este código hace toda la magia:
$sentencia  = $pdo->prepare(SELECT @@identity AS id”);
$sentencia ->execute();
$resultado = $sentencia ->fetchAll();
$id = 0;
foreach ($resultado as $row) {
        $id = $row[“id”];
    }

Vamos a crear una base de datos llamada relacional con dos tablas unidas por una foreign key
tabla: estudiantes
tabla: cursos

Como se que eres don vergas y doña vergas te voy dejar el código de la base datos y puedas implementarlo de forma rápida:

CREATE TABLE `cursos` (
`id_cursos` int(11) NOT NULL,
`id_estudiante` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `estudiante` (
`id_estudiante` int(11) NOT NULL,
`nombre` varchar(60) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


ALTER TABLE `estudiante`
ADD PRIMARY KEY (`id_estudiante`);

ALTER TABLE `estudiante`
MODIFY `id_estudiante` int(11) NOT NULL AUTO_INCREMENT;

Ahora nos toca la webservices: como yo lo estoy creando de forma loca con mi xampp creare una carpeta llamada relacional y guardare ahí mi webservices con el nombre de registro.php
la ruta seria: C:xampphtdocsrelacional

<?php
$host_database = 'mysql:dbname=relacional;host=localhost';
$username = "root";
$password = "12345";

try{ $pdo = new PDO($host_database,$username,$password); }
catch(PDOException $e){ echo 'Error: ' . $e->getMessage(); }

if ($_SERVER['REQUEST_METHOD'] == 'POST'){

$nombre = $_POST['nombre'];
$Curso = $_POST['id_cursos'];
//Recibimos los valores de los cursos seleccionados
$sentencia = $pdo->prepare( 'INSERT INTO estudiante (id_estudiante,nombre) VALUES (null, :nombre)' );
$sentencia ->execute(array( ':nombre' => $nombre, ));
//Después del insert consultamos el id insertado:
$sentencia = $pdo->prepare("SELECT @@identity AS id");
$sentencia ->execute();
$resultado = $sentencia ->fetchAll();
$id = 0;
foreach ($resultado as $row) {
$id = $row["id"];
}

//Ya tenemos el último id insertado, ahora hacemos el insert en la tabla students_courses

$sentencia = $pdo->prepare( 'INSERT INTO cursos (id_cursos,id_estudiante) VALUES (:id_cursos, :id_estudiante)' );
$sentencia ->bindParam(':id_cursos', $idCurso);
$sentencia ->bindParam(':id_estudiante', $id); //Variable del último id registrado en la tabla de students

//Insertamos dependiendo de los id's elegidos
foreach ($Curso as $option_value)
{
$idCurso = $option_value;
$sentencia ->execute();
}
}

?>

Ya esta armado nuestra webservices ahora hay que crear la app, para ello crearemos una nueva aplicación y le agregaremos lo siguiente en su builgradle:

useLibrary'org.apache.http.legacy'

 Y quedara de la siguiente forma:

android {
compileSdkVersion 26
buildToolsVersion "26.0.2"
defaultConfig {
applicationId "com.androidmorefast.pc.appwebservicesbasico"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"

useLibrary'org.apache.http.legacy'
}

Ahora en nuestra aplicación debemos ir a nuestro res->values-> String
Ahí debemos agregar un array llamado cursos que contendrá todos nuestros cursos:

<resources>
<string name="app_name">AppWebServicesBasico</string>
<string-array name="cursos">
<item>Matematicas</item>
<item>Algebra</item>
<item>Quimica</item>
<item>Ciencias</item>
<item>Fisica</item>
</string-array>
</resources>

En nuestro AndroidManifest debemos agregar la siguiente linea:

<uses-permission android:name="android.permission.INTERNET"/>


Debemos crear una interfaz de un editText un spinner y un botón deberia quedar como se muestra en la siguiente imagen:

Les dejo  el código para que lo puedan agregar en su activity_main
<?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:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.androidmorefast.pc.appwebservicesbasico.MainActivity">

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:gravity="center"
android:text="Enviar datos al servidor"
android:textSize="20dp"
android:textColor="#000000" />

<EditText
android:id="@+id/txtNombre"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/textView"
android:layout_marginTop="28dp"
android:ems="10"
android:gravity="center"
android:hint="Ingresa Nombre"
android:inputType="textPersonName" />

<Spinner
android:id="@+id/sp_cursos"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/txtNombre"
android:layout_centerHorizontal="true"
android:layout_marginTop="46dp"
android:ems="10"
android:gravity="center"
android:entries="@array/cursos"/>
<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/sp_cursos"
android:layout_centerHorizontal="true"
android:layout_marginTop="38dp"
android:text="Enviar datos " />
</RelativeLayout>


Por ultimo nuestro MainActivity contendra lo siguiente

package com.androidmorefast.pc.appwebservicesbasico;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

String ServerURL = "http://192.168.8.133/relacional/registrar.php" ;
EditText nombre;
Button button;
String TempNombre;
int TempCurso;
Spinner curso;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
curso = (Spinner) findViewById(R.id.sp_cursos);
nombre = (EditText)findViewById(R.id.txtNombre);
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

ObtenerDatos();
InsertaDatos(TempNombre, TempCurso);
}
});
}

public void ObtenerDatos(){

TempNombre = nombre.getText().toString();

TempCurso = curso.getSelectedItemPosition();

}

public void InsertaDatos(final String nombre,final int cursos){

class SendPostReqAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {

String NombreHolder = nombre ;
int CursoHolder = cursos ;

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

nameValuePairs.add(new BasicNameValuePair("id_cursos[]", Integer.toString(CursoHolder)));
nameValuePairs.add(new BasicNameValuePair("nombre", NombreHolder));


try {
HttpClient httpClient = new DefaultHttpClient();

HttpPost httpPost = new HttpPost(ServerURL);

httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();


} catch (ClientProtocolException e) {

} catch (IOException e) {

}
return "Datos insertados con éxito";
}

@Override
protected void onPostExecute(String result) {

super.onPostExecute(result);

Toast.makeText(MainActivity.this, "Datos enviados con éxito", Toast.LENGTH_LONG).show();
}
}
SendPostReqAsyncTask sendPostReqAsyncTask = new SendPostReqAsyncTask();
sendPostReqAsyncTask.execute(nombre,Integer.toString(cursos));
}

}

Y con eso hemos culminado el ejercicio, espero les aya servido.

2 comentarios en «como registrar dos tablas relacionadas en android studio y mysql»

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

WhatsApp chat