|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
   AutoIt (Programación) Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  Teleco - Emisora de A.M. Visual Basic Cosas de Windows Webs interesantes
Translate:
Búsqueda en este sitio:


.

B4A en español - Juan Antonio Villalpando
(BASIC4Android)

-- Tutorial de B4A --

Volver al índice del tutorial

____________________________

30B.- Obtener, almacenar, buscar y borrar datos en una base de datos MySQL.

- Tutoriales. Obtener, almacenar, buscar y borrar datos en una base de datos MySQL.

- Presentación.

- Este es el mismo tutorial que el anterior, pero espero que sea más clarito, es el mismo código, todo es casi igual, pero explicado para un entendimiento más fácil.

- Hazlo exactamente como indico, incluso respetando el nombre de base de datos, usuario y tabla.

- Es preferible que lo realices tal como lo expongo, cuando ya te funcione, puedes adaptarlo a tus necesidades.

_____________________
- Base de datos.

- Vamos a realizarlo en un servidor remoto. Concretamente en Hostinger gratuito.

- Entra en Hostinger y create una cuenta.

- Aquí está es tutorial para crearte una cuenta en Hostinger: Servidor gratuito hostinger.

- Yo he creado mi cuenta y el dominio gratuito que me han asignado es: kio4.esy.es, obviamente tú tendrás otro.
-----------------------------------------------------------

- En ese mismo tutorial explico cómo utilizar el cliente de FTP Filezilla, bájatelo, lo instalas y aprende a utilizarlo.

- Intenta subir un par de archivos cualquiera de tu ordenador al hosting gratuito mediante el Filezilla.

-----------------------------------------------------------

- En ese mismo tutorial explico cómo crear una base de datos MySQL, crea una base de datos que se llame comun y un usuario que se llame juan. (No pongas otros nombres, escribe lo que te he indicado, la base de datos: comun y el usuario: juan). Estableces una contraseña. Te asignarán una base de datos y un usuario con un número, por ejemplo:

- Mi base de datos se llama: u798509677_comun

- El usuario de entrada es: u798509677_juan

- Crea solo la base de datos, por ahora no crees ninguna tabla, la tabla la creamos como indico a continuación:

--------------------------------------------------------

- Estando en la base de datos vamos a crear la tabla paises y agregar algunos datos.

- En vez de hacerlo manualmente, lo vamos a Importar.

- Copia el siguiente archivo paises.sql en tu ordenador.

- Vamos a importarlo a la base de datos u798509677_comun que hemos creado:

paises.sql

 

CREATE TABLE IF NOT EXISTS `paises` (
`ID` varchar(4) CHARACTER SET utf8 COLLATE utf8_spanish2_ci NOT NULL,
`nombre` varchar(30) CHARACTER SET utf8 COLLATE utf8_spanish2_ci NOT NULL,
`poblacion` varchar(11) CHARACTER SET utf8 COLLATE utf8_spanish2_ci NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

 

INSERT INTO `paises` (`ID`, `nombre`, `poblacion`) VALUES
('ES', 'España', '47000'),
('MX', 'México', '114000'),
('CH', 'Chile', '17000'),
('CO', 'Colombia', '47000'),
('PE', 'Perú', '30000'),
('VE', 'Venezuela', '29000'),
('EC', 'Ecuador', '15000'),
('BO', 'Bolivia', '11000'),
('PA', 'Paraguay', '6000'),
('UR', 'Uruguay', '3000'),
('HO', 'Honduras', '8000'),
('GU', 'Guatemala', '16000'),
('AR', 'Argentina', '40000'),
('CU', 'Cuba', '11000'),
('NI', 'Nicaragua', '6100'),
('CR', 'Costa Rica', '4700');

- En el archivo anterior fíjate que todos las líneas de los paises terminan en coma,
excepto el último que pongas, que debe terminar en punto y coma;

- Cuando lo importes pones el conjunto de caracteres en iso-8859-1 que corresponde a los caracteres latinos con acentos y demás.

- Ya tenemos preparada la base de datos: u798509677_comun y dentro de ella la tabla: paises.

- Puedes ir a "Examinar" y ver los paises insertados.

___________________________
1.- Ver listado de países y su población.

Designer - Layout

 


Librerías necesarias (HTTP y JSON).

Mediante el Designer creamos la pantalla que muestro en el dibujo de la izquierda.

 

Insertamos dos Label: Label1 y Label2

Insertamos un ListView1.

Guardamos el Layout con el nombre: 1


En funcionamiento.

 

Debes modificar las dos líneas siguientes con el dominio que has obtenido en hostinger.

req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8"))

Código del Basic4Android
' De los tutoriales de b4a

' Adaptado a local por Juan Antonio Villalpando
' juana1991@yahoo.com 

Sub Process_Globals
Dim hc As HttpClient
Dim paises, poblacion As Int
paises = 1    ' Es la tarea 1
poblacion = 2 ' Es la tarea 2
End Sub

Sub Globals
' Renglones puede contener dos renglones:
' Renglon1 (ES) 
' Renglon2 (España)
Type Renglones (Renglon1 As String, Renglon2 As String)
Dim Label1, Label2 As Label
Dim ListView1 As ListView
End Sub

Sub Activity_Create(FirstTime As Boolean)
If FirstTime Then
hc.Initialize("hc")
End If
Activity.LoadLayout("1")
Buscar_lista_de_paises
End Sub

Sub Buscar_lista_de_paises
ProgressDialogShow("Buscando lista de países.")

Dim req As HttpRequest
Dim Query As String
Query="SELECT nombre, ID FROM paises ORDER BY ID"
req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8"))
hc.Execute(req, paises) '''''''' En ResponseSuccess hará el Case de paises
End Sub

' Esta es la Respuesta de la orden hc.Execute
Sub hc_ResponseSuccess (Response As HttpResponse, tarea As Int)
Dim res As String
res = Response.GetString("UTF8")
Log("Respuesta del servidor: " & res)
'res =  [{"nombre":"Argentina","id":"AR"},.... hasta ....,{"nombre":"Venezuela","id":"VE"}]
Dim parser As JSONParser
parser.Initialize(res)

Select tarea

' ************* PAISES *****************
Case paises
' Añade paises la ListView1
Dim countries As List
countries.Initialize
countries = parser.NextArray
For i = 0 To countries.Size - 1
Dim m As Map
m = countries.Get(i)
Dim Renglon As Renglones
Renglon.Renglon1 = m.Get("ID")      ' ES
Renglon.Renglon2 = m.Get("nombre")  ' España
ListView1.AddTwoLines2(Renglon.Renglon1, Renglon.Renglon2, Renglon)
Next
ProgressDialogHide

' ************* POBLACION **************
Case poblacion
Dim l As List
l = parser.NextArray
If l.Size = 0 Then
Label1.Text = "N/A"
Else
Dim m As Map
m = l.Get(0)
Label1.Text = NumberFormat2(m.Get("poblacion"),0, 0, 0, True) & ".000"
End If
End Select
Response.Release
End Sub

' Cuando pulsa en el ListView, busca en la BD del Servidor la población
Sub ListView1_ItemClick (Position As Int, Value As Object)

If IsBackgroundTaskRunning(hc, poblacion) Then ' Está ocupado en llamada anterior.
ToastMessageShow("Espera hasta completar la llamada anterior.", False)
Return
End If

Dim Renglon As Renglones
Renglon = Value
Label2.Text = Renglon.Renglon2 ' España
Label1.Text = "Conectando con el servidor..."

Dim req As HttpRequest
Dim Query As String
Query="SELECT poblacion FROM paises WHERE ID='" & Renglon.Renglon1 & "'"
req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8"))
hc.Execute(req, poblacion)  '''''''' En ResponseSuccess hará el Case de poblacion
End Sub


' Error en la conexión con la Base de datos.
Sub hc_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, tarea As Int)
Log("Error: " & Reason & ", StatusCode: " & StatusCode)
If Response <> Null Then
Log(Response.GetString("UTF8"))
Response.Release
End If
ProgressDialogHide
End Sub

El código lo que hace es ir al archivo paises.php,(ver en la tabla más abajo) este va a la base de datos y mediante la línea:

$query = file_get_contents("php://input");

el paises.php devuelve el listado de todos los paises en un formato muy conocido llamado JSON. (de Json a html).

print json_encode($rows);

El programa B4A, toma los datos del archivo JSON de la forma...

a) cuando pide todos los registros...

Respuesta del servidor: [{"nombre":"Argentina","id":"AR"},{"nombre":"Bolivia","id":"BO"},.... hasta ........,{"nombre":"Venezuela","id":"VE"}]

b) cuando pide población...

Llamada a población: (JSONTokener) at character 0 of [{"poblacion":"15000"}]

lo convierte (parser), lo Mapea, es decir trocea los campos

For i = 0 To countries.Size - 1
Dim
m As Map
m = countries.Get(i)

y los presenta en el ListView.

Es un código un poco complicados para los que se inician en este tipo de programación, pero creo que haciendo pruebas le puedes sacar partido y adaptarlo a tus necesidades.

______________________
- Subir el archivo PHP al servidor.

- Copia este archivo paises.php a tu ordenador y súbelo mediante el cliente FTP Filezilla al hosting gratuito de hostinger.

- Tendrás que modificar los datos de conexión a la base de datos, serán otros números y otra contraseña.

$databasehost = "mysql.hostinger.es";
$databasename = "u798509677_comun";
$databaseusername ="u798509677_juan";
$databasepassword = "contraseña";

paises.php       
// De los tutoriales de b4a

// Adaptado por Juan Antonio Villalpando
// juana1991@yahoo.com 

<?php
error_reporting (E_ALL ^ E_NOTICE ^ E_DEPRECATED);  

$databasehost = "mysql.hostinger.es";
$databasename = "u798509677_comun";
$databaseusername ="u798509677_juan";
$databasepassword = "contraseña";


$con = mysql_connect($databasehost,$databaseusername,$databasepassword) or die(mysql_error());
mysql_set_charset("utf8"); mysql_select_db($databasename) or die(mysql_error()); $query = file_get_contents("php://input"); $sth = mysql_query($query); if (mysql_errno()) { header("HTTP/1.1 500 Internal Server Error"); echo $query.'\n'; echo mysql_error(); } else { $rows = array(); while($r = mysql_fetch_assoc($sth)) { $rows[] = $r; } print json_encode($rows); } ?>

paises.php   

- Otra versión de paises.php. A algunos usuarios no le ha funcionado la versión anterior de paises.php y sí le ha funcionado esta otra:

<?php

$databasehost = "mysql.hostinger.es";
$databasename = "u798509677_comun";
$databaseusername ="u798509677_juan";
$databasepassword = "contraseña";

$con = mysqli_connect($databasehost,$databaseusername,$databasepassword, $databasename) or die(mysqli_error($con));
mysqli_set_charset ($con , "utf8");
$query = file_get_contents("php://input");
$sth = mysqli_query($con, $query);

if (mysqli_errno($con)) {
   header("HTTP/1.1 500 Internal Server Error");
   echo $query.'\n';
   echo mysqli_error($con);
}
else
{
   $rows = array();
   while($r = mysqli_fetch_assoc($sth)) {
     $rows[] = $r;
   }
   $res = json_encode($rows);
    echo $res;
    mysqli_free_result($sth);
}
mysqli_close($con);
?>
			
			

- STOP STOP STOP -

- Prueba ahora la aplicación en el Emulador y en el móvil, debe funcionar.

- Si no funciona envíame un correo a juana1991@yahoo.com, si te funciona y me quieres enviar un comentario, pues también.

Errores obtenidos.

NOTA 1:

Algunos usuarios obtienen el siguiente error con este código utilizando versiones de PHP 5.5 o superiores.

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in

Para solventarlo prueba poner esta línea azul...

<?php
error_reporting ( E_ALL  ^  E_NOTICE  ^  E_DEPRECATED );

$databasehost = "mysql.hostinger.es";
$databasename = "u798509677_comun";
$databaseusername ="u798509677_juan";
$databasepassword = "contraseña";

$con = mysql_connect($databasehost,$databaseusername,$databasepassword) or die(mysql_error());
mysql_set_charset("utf8");
mysql_select_db($databasename) or die(mysql_error());
$query = file_get_contents("php://input");

....................

 

O también esta otra manera...

<?php

$databasehost = "mysql.hostinger.es";
$databasename = "u798509677_comun";
$databaseusername ="u798509677_juan";
$databasepassword = "contraseña";



$con = mysqli_connect( $databasehost,$databaseusername,$databasepassword, $databasename ) or die(mysql_error());
mysql_set_charset("utf8");
$query = file_get_contents("php://input" );

...................
_____________________________________________________________________________________

NOTA 2:

Otros usuarios obtienen el error: android.os.NetworkOnMainThreadException

para solucionarlo modificamos la Subrutina Activity_Create de la siguiente manera y activamos las librerías Phone y Reflection.

Sub Activity_Create(FirstTime As Boolean)
If FirstTime Then
hc.Initialize("hc")
End If
Activity.LoadLayout("1")
Buscar_lista_de_paises
 
' Evita el error android.os.NetworkOnMainThreadException
' Activar librerías Phone y Reflection
Dim p As Phone
If p.SdkVersion >= 9 Then
   Dim r As Reflector
   r.Target = r.CreateObject("android.os.StrictMode$ThreadPolicy$Builder")
   r.Target = r.RunMethod("permitAll")
   r.Target = r.RunMethod("build")
   r.RunStaticMethod("android.os.StrictMode", "setThreadPolicy", _
      Array As Object(r.Target), Array As String("android.os.StrictMode$ThreadPolicy"))
End If
End Sub
ERRORES



Este error ocurre cuando se utiliza las nuevas versiones a partir de la SDK android 2.3.
Para corregirlo hay que cambiar la vieja librería httputils por la nueva okhttp La librería OkHttp es casi igual que la antigura Http, pero los nombres de los objetos deben comenzar por Ok (OkHttpClient, OkHttpResponse and OkHttpRequest) Puedes obtener información en el foro oficial: https://www.b4x.com/android/forum/threads/okhttp-replaces-the-http-library.54723/#content

___________________________

2.- Introducir datos en la Base de Datos, MySQL.

Ahora lo vamos a realizar al revés, es decir desde el Android vamos a introducir datos en una base de datos de tipo MySQL en un servidor web.

Vamos a utilizar el mismo servidor visto anteriormente y la misma base de datos.

Designer - Layout


Librería necesaria (HTTP. La JSON no es necesaria en este código)

 

Mediante el Designer creamos la pantalla que muestro en el dibujo de la izquierda.

 

Insertamos tres Label: Label1, Label2 y Label3
Insertamos tres EditText: EditText1, EditText2 y EditText3
Insertamos un Button1

Guardamos el Layout con el nombre: Layout

Fíjate en la línea:

req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8"))

Código del Basic4Android

' Juan Antonio Villalpando
' juana1991@yahoo.com

Sub Process_Globals
Dim hc As HttpClient
End Sub

Sub Globals
Dim EditText1, EditText2, EditText3 As EditText
Dim ID, nombre, poblacion, datos As String
End Sub

Sub Activity_Create(FirstTime As Boolean)
If FirstTime Then
hc.Initialize("hc")
End If
Activity.LoadLayout("Layout") ' Cargamos el Designer
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub Button1_Click
ID = EditText1.Text
nombre = EditText2.Text
poblacion = EditText3.Text

Dim req As HttpRequest
Dim Query As String
Query="INSERT INTO paises (ID, nombre, poblacion) VALUES ('" & ID & "','" & nombre & "','" & poblacion & "')"
req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8"))
hc.Execute(req, 1)

End Sub

Sub hc_ResponseSuccess (Response As HttpResponse, tarea As Int)
Dim resultString As String
resultString = Response.GetString("UTF8")

Msgbox("Los datos han sido almacenados", "Éxito de operación")
End Sub

Sub hc_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, tarea As Int)
Log("Error: " & Reason & ", StatusCode: " & StatusCode)
If Response <> Null Then
Log(Response.GetString("UTF8"))
Response.Release
End If
End Sub 

- Ten cuidado en esta línea con las comillas "dobles" y 'simples' y con las '"dos juntas"'
Query="INSERT INTO paises (ID, nombre, poblacion) VALUES ('" & ID & "','" & nombre & "','" & poblacion & "')"

- Fíjate que el archivo paises.php, es el mismo que el del apartado anterior, este archivo no tiene código de inserción. Solo se utiliza para conectar con la base de datos, ya que el código de inserción va en la misma llamada.

Query="INSERT INTO paises (ID, nombre, poblacion) VALUES ('" & ID & "','" & nombre & "','" & poblacion & "')"
req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8"))

- Con este código podemos poner paises con espacios: Costa Rica, Rep. Dominicana.

___________________________

3.- Borrar datos en la Base de Datos, MySQL.

Vamos a volver al primer programa e insertar un botón de borrado, pulsaremos sobre un país y en caso de que lo queramos borrar pulsamos el botón de "Borrar"

Designer - Layout

 


Librería necesaria (HTTP y JSON)

Mediante el Designer creamos la pantalla que muestro en el dibujo de la izquierda.

 

Está basado en el primer programa, solamente he añadido un Button de "Borrar"

Guardamos el Layout con el nombre: 1

 

 

El código es una ampliación del primer programa, solamente he añadido las líneas indicadas.

 

Código del Basic4Android
' De los tutoriales de b4a

' Adaptado a local por Juan Antonio Villalpando
' juana1991@yahoo.com 

Sub Process_Globals
Dim hc As HttpClient
Dim paises, poblacion As Int
paises = 1    ' Es la tarea 1
poblacion = 2 ' Es la tarea 2
End Sub

Sub Globals
' Renglones puede contener dos renglones:
' Renglon1 (ES) 
' Renglon2 (España)
Type Renglones (Renglon1 As String, Renglon2 As String)
Dim Label1, Label2 As Label
Dim ListView1 As ListView
Dim borraID As String ' PARA BORRAR, CÓDIGO JUAN ANTONIO *****************
End
Sub Sub Activity_Create(FirstTime As Boolean) If FirstTime Then hc.Initialize("hc") End If Activity.LoadLayout("1") Buscar_lista_de_paises End Sub Sub Buscar_lista_de_paises ProgressDialogShow("Buscando lista de países.") Dim req As HttpRequest Dim Query As String Query="SELECT nombre, ID FROM paises ORDER BY ID" req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8")) hc.Execute(req, paises) '''''''' En ResponseSuccess hará el Case de paises End Sub ' Esta es la Respuesta de la orden hc.Execute Sub hc_ResponseSuccess (Response As HttpResponse, tarea As Int) Dim res As String res = Response.GetString("UTF8") Log("Respuesta del servidor: " & res) 'res = [{"name":"Argentina","id":"AR"},.... hasta ....,{"name":"Venezuela","id":"VE"}] Dim parser As JSONParser parser.Initialize(res) Select tarea ' ************* PAISES ***************** Case paises ' Añade paises la ListView1 Dim countries As List countries.Initialize countries = parser.NextArray For i = 0 To countries.Size - 1 Dim m As Map m = countries.Get(i) Dim Renglon As Renglones Renglon.Renglon1 = m.Get("ID") ' ES Renglon.Renglon2 = m.Get("nombre") ' España ListView1.AddTwoLines2(Renglon.Renglon1, Renglon.Renglon2, Renglon) Next ProgressDialogHide ' ************* POBLACION ************** Case poblacion Dim l As List l = parser.NextArray If l.Size = 0 Then Label1.Text = "N/A" Else Dim m As Map m = l.Get(0) Label1.Text = NumberFormat2(m.Get("poblacion"),0, 0, 0, True) & ".000" End If End Select Response.Release End Sub ' Cuando pulsa en el ListView, busca en la BD del Servidor la población Sub ListView1_ItemClick (Position As Int, Value As Object) If IsBackgroundTaskRunning(hc, poblacion) Then ' Está ocupado en llamada anterior. ToastMessageShow("Espera hasta completar la llamada anterior.", False) Return End If Dim Renglon As Renglones Renglon = Value Label2.Text = Renglon.Renglon2 ' España
borraID = Renglon.Renglon1 ' PARA BORRAR, CÓDIGO JUAN ANTONIO ****************** Label1.Text = "Conectando con el servidor..." Dim req As HttpRequest Dim Query As String Query="SELECT poblacion FROM paises WHERE ID='" & Renglon.Renglon1 & "'" req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8")) hc.Execute(req, poblacion) '''''''' En ResponseSuccess hará el Case de poblacion End Sub ' Error en la conexión con la Base de datos. Sub hc_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, tarea As Int) Log("Error: " & Reason & ", StatusCode: " & StatusCode) If Response <> Null Then Log(Response.GetString("UTF8")) Response.Release End If ProgressDialogHide End Sub ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''' ESTA ES LA PARTE DEL CODIGO QUE HACE EL BORRADO Sub Button1_Click Dim req As HttpRequest Dim Query As String Query="DELETE FROM paises WHERE ID='" & borraID & "'" req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8")) hc.Execute(req, 3) ' La tarea 3 no existe en el Select ListView1.Clear Buscar_lista_de_paises Label1.Text="" Label2.Text="" End Sub

En el código anterior he actuado en las líneas...

Dim borraID As String ' PARA BORRAR, CÓDIGO JUAN ANTONIO *********

borraID = Renglon.Renglon1 ' PARA BORRAR, CÓDIGO JUAN ANTONIO *******

y la Subrutina final del Button1_Click.

Debes poner tu IP local en...

req.InitializePost2("http://kio4.esy.es/paises.php", query.GetBytes("UTF8"))

Cuidado con las comillas dobles y simple:

Query="DELETE FROM paises WHERE ID='" & borraID & "'"

- Fíjate que el archivo paises.php, es el mismo que el del apartado anterior, este archivo no tiene código de borrado. Solo se utiliza para conectar con la base de datos, ya que el código de inserción va en la misma llamada.

Query="DELETE FROM paises WHERE ID='" & borraID & "'"
req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8"))

__________________________________

Si miras más abajo en los antiguos códigos te darás cuenta que se estudian dos maneras de actuar sobre la base de datos
- una poniendo el Query de la orden MySQL (en este caso el archivo paises.php, solo se utiliza para hacer la conexión con la base de datos, pero el archivo no realiza el borrado).

Query="DELETE FROM paises WHERE ID='" & borraID & "'"
req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8"))

- otra llamando a un archivo .php donde se encuentra el código de borrado
datos="http://kio4.esy.es/androidbd4.php?ID=" & borraID
Dim req As HttpRequest
req.InitializeGet(datos)
hc.Execute(req, 3)

___________________________

4.- Buscar un país mediante un casillero.

Vamos a seguir modificando el código. Ahora vamos a introducir un casillero (EditText) y otro botón (Button2).
Escribiremos el nombre de cualquier país, que se encuentre en la base de datos. Al pulsar el botón el programa irá a la base de datos, buscará y tomará la información de código, nombre y población de país introducido y lo devolverá al programa.
En los Label1 y Label2 aparecerá el nombre del país y su población.

Designer - Layout

 

Mediante el Designer modificamos nuestro Layout como muestro en el dibujo de la izquierda.

 

Añado un EditText1 y un Button1 cuyo texto es Buscar.

El Layout sigue llamándose 1 como en los apartados anteriores.

Vuelvo a poner el código completo con las modificaciones de BUSCAR.

Código del Basic4Android
' De los tutoriales de b4a

' Adaptado a local por Juan Antonio Villalpando
' juana1991@yahoo.com 

Sub Process_Globals
Dim hc As HttpClient
Dim paises, poblacion, buscar As Int
paises = 1    ' Es la tarea 1
poblacion = 2 ' Es la tarea 2
buscar = 3 ' Es la tarea 3 PARA BUSCAR, CÓDIGO JUAN ANTONIO ------
End Sub

Sub Globals
' Renglones puede contener dos renglones:
' Renglon1 (ES) 
' Renglon2 (España)
Type Renglones (Renglon1 As String, Renglon2 As String)
Dim Label1, Label2 As Label
Dim ListView1 As ListView
Dim EditText1 As EditText
Dim borraID As String ' PARA BORRAR, CÓDIGO JUAN ANTONIO *********
End Sub

Sub Activity_Create(FirstTime As Boolean)
If FirstTime Then
hc.Initialize("hc")
End If
Activity.LoadLayout("1")
Buscar_lista_de_paises
End Sub

Sub Buscar_lista_de_paises
ProgressDialogShow("Buscando lista de países.")

Dim req As HttpRequest
Dim Query As String
Query="SELECT nombre, ID FROM paises ORDER BY ID"
' req.InitializePost2("http://192.168.1.3/paises.php", Query.GetBytes("UTF8"))
req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8"))
hc.Execute(req, paises) '''''''' En ResponseSuccess hará el Case de paises
End Sub

' Esta es la Respuesta de la orden hc.Execute
Sub hc_ResponseSuccess (Response As HttpResponse, tarea As Int)
Dim res As String
res = Response.GetString("UTF8")
Log("Respuesta del servidor: " & res)
'res =  [{"name":"Argentina","id":"AR"},.... hasta ....,{"name":"Venezuela","id":"VE"}]
Dim parser As JSONParser
parser.Initialize(res)

Select tarea

' ************* PAISES *****************
Case paises
' Añade paises la ListView1
Dim countries As List
countries.Initialize
countries = parser.NextArray
For i = 0 To countries.Size - 1
Dim m As Map
m = countries.Get(i)
Dim Renglon As Renglones
Renglon.Renglon1 = m.Get("ID")      ' ES
Renglon.Renglon2 = m.Get("nombre")  ' España
ListView1.AddTwoLines2(Renglon.Renglon1, Renglon.Renglon2, Renglon)
Next
ProgressDialogHide

' ************* POBLACION **************
Case poblacion
Dim l As List
l = parser.NextArray
If l.Size = 0 Then
Label1.Text = "N/A"
Else
Dim m As Map
m = l.Get(0)
Label1.Text = NumberFormat2(m.Get("poblacion"),0, 0, 0, True) & ".000"
End If


' ************* BUSCAR, CÓDIGO JUAN ANTONIO *****------
Case buscar
Dim l As List
l = parser.NextArray
If l.Size = 0 Then
Label1.Text = "N/A"
Else
Dim m As Map
m = l.Get(0)
Label1.Text = m.Get("nombre")
Label2.Text =  m.Get("poblacion")
End If
End Select

Response.Release
End Sub

' Cuando pulsa en el ListView, busca en la BD del Servidor la población
Sub ListView1_ItemClick (Position As Int, Value As Object)

If IsBackgroundTaskRunning(hc, poblacion) Then ' Está ocupado en llamada anterior.
ToastMessageShow("Espera hasta completar la llamada anterior.", False)
Return
End If

Dim Renglon As Renglones
Renglon = Value
Label2.Text = Renglon.Renglon2 ' España
borraID = Renglon.Renglon1  ' PARA BORRAR, CÓDIGO JUAN ANTONIO *******
Label1.Text = "Conectando con el servidor..."

Dim req As HttpRequest
Dim Query As String
Query="SELECT poblacion FROM paises WHERE ID='" & Renglon.Renglon1 & "'"
' req.InitializePost2("http://192.168.1.3/paises.php", Query.GetBytes("UTF8"))
req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8"))
hc.Execute(req, poblacion)  '''''''' En ResponseSuccess hará el Case de poblacion
End Sub


' Error en la conexión con la Base de datos.
Sub hc_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, tarea As Int)
Log("Error: " & Reason & ", StatusCode: " & StatusCode)
If Response <> Null Then
Log(Response.GetString("UTF8"))
Response.Release
End If
ProgressDialogHide
End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''' ESTA ES LA PARTE DEL CODIGO QUE HACE EL BORRADO 

Sub Button1_Click
Dim req As HttpRequest
Dim Query As String

Query="DELETE FROM paises WHERE ID='" & borraID & "'"
' req.InitializePost2("http://192.168.1.3/paises.php", Query.GetBytes("UTF8"))
req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8"))
hc.Execute(req, 4) ' ------- He cambiado esto, 4 es una tarea que no existe en Select

ListView1.Clear
Buscar_lista_de_paises
Label1.Text=""
Label2.Text="" 
End Sub


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''''''' ESTA ES LA PARTE DEL CODIGO QUE HACE LA BÜSQUEDA

Sub Button2_Click
Dim req As HttpRequest
Dim Query As String
Dim busca As String
busca = EditText1.Text

Query="SELECT * FROM paises WHERE nombre LIKE '" & busca & "'"
' req.InitializePost2("http://192.168.1.3/paises.php", Query.GetBytes("UTF8"))
req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8"))
hc.Execute(req, buscar)

End Sub

Comentarios

Al final del código he añadido la Subrutina del Button2, en donde obtengo el nombre del país que el usuario quiere buscar.
Establezco una llamada de búsqueda:

Query="SELECT * FROM paises WHERE nombre LIKE '" & busca & "'"

El programa va al servidor MySQL.
En este caso he probado el código en un servidor gratuito en Internet llamado hostinger

req.InitializePost2("http://kio4.esy.es/paises.php", Query.GetBytes("UTF8"))

Lanza llamada al servidor mediante

hc.Execute(req, buscar)

buscar es una variable que utilizaré posteriormente cuando me llegue la respuesta.

Cuando llega la respuesta, el código se dirige a la subrutina:

' Esta es la Respuesta de la orden hc.Execute
Sub hc_ResponseSuccess (Response As HttpResponse, tarea As Int)

La información se obtiene en la variable

res = Response.GetString("UTF8")

Esta información viene en formato JSON (por lo cual necesitamos la librería correspondiente para fácilmente desglosar la información).

El código entra en un Select que tiene tres opciones (paises, poblacion y buscar), cuando enviamos la llamada del hc.Execute digimos que cuando viniera la respuesta tomara en cuenta la opción buscar hc.Execute(req, buscar)

De tal manera que cuando llega la respuesta el código se dirige a la parte
************* BUSCAR, CÓDIGO JUAN ANTONIO *****------
Case buscar

En esa parte desglosa la información obtenida del código JSON
Respuesta del servidor: [{"ID":"GU","nombre":"Guatemala","poblacion":"16000"}]

y presenta el país y su población en los Label1 y Label2.

Al principio del código se le ha asignado a buscar un número de tarea para el funcionamiento del Case

buscar = 3 ' Es la tarea 3 PARA BUSCAR, CÓDIGO JUAN ANTONIO ------

____________________________________________

El programa se podría haber realizado de otra manera.

Hacemos una llamada para obtener todos los paises y su población, como lo hemos hecho para que los paises se inserten en el ListView.
Esa llamada, en donde están todos los paises, se obtiene en la variable res

'res = [{"name":"Argentina","id":"AR"},.... hasta ....,{"name":"Venezuela","id":"VE"}]

Una vez que tenemos todos los paises en la variable res, buscamos la del país requerido.

Es decir, podemos bajar toda la base de datos desde el servidor MySQL a nuestro teléfono Android, y una vez bajada podemos actuar mediante la librería JSON en la variable res que es donde se encuentra bajada toda la base de datos.

________________________________

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información