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