Estimados les traigo un pequeño tutorial que les servirá mucho, se trata de usar sentencias preparadas con PDO usando una BD remota MySQL, este método de conectarse a una bd remota se utiliza mucho en Android Studio.
Por ahora Comenzare con ingresar datos a la BD y listar esos datos, mas adelante iré agregando actualización y eliminación de los datos.
Comenzaremos con los Archivos PHP que deben tener en su servidor, hosting o localhost.
*Nuestro Script para crear la Tabla meta en su BD.
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
mysql_login.php
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Database.php
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Meta.php
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
insertar_meta.php
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
obtener_metas.php
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Esos serian los archivos php los cuales se encargaran de hacer el trabajo.
*Librerías que deben usar.
		
		
	
	
		 
	
*Ahora nuestro Layout y Activity en b4a que inserta los datos quedaría de la siguiente manera.
		 
	
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
*Ahora nuestro Layout y Activity Listar.
		 
	
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Por ahora seria todo, cualquier consulta, error o acotación me lo dejan en un comentario.
			
			Por ahora Comenzare con ingresar datos a la BD y listar esos datos, mas adelante iré agregando actualización y eliminación de los datos.
Comenzaremos con los Archivos PHP que deben tener en su servidor, hosting o localhost.
*Nuestro Script para crear la Tabla meta en su BD.
			
				B4X:
			
		
		
		CREATE TABLE `meta` (
  `idMeta` int(3) NOT NULL AUTO_INCREMENT,
  `titulo` varchar(56) NOT NULL,
  `descripcion` varchar(128) NOT NULL,
  `prioridad` varchar(20) DEFAULT NULL,
  `fechaLim` date DEFAULT NULL,
  `categoria` varchar(20) NOT NULL,
  PRIMARY KEY (`idMeta`)
) ENGINE=MyISAM AUTO_INCREMENT=44 DEFAULT CHARSET=latin1;mysql_login.php
			
				B4X:
			
		
		
		<?php
/**
* Provee las constantes para conectarse a la base de datos
* Mysql.
*/
define("HOSTNAME", "Servidor");
define("DATABASE", "basededatos");
define("USERNAME", "usuario");
define("PASSWORD", "password");
?>Database.php
			
				B4X:
			
		
		
		<?php
/**
* Clase que envuelve una instancia de la clase PDO
* para el manejo de la base de datos
*/
require_once 'mysql_login.php';
class Database
{
    /**
     * Única instancia de la clase
     */
    private static $db = null;
    /**
     * Instancia de PDO
     */
    private static $pdo;
    final private function __construct()
    {
        try {
            // Crear nueva conexión PDO
            self::getDb();
        } catch (PDOException $e) {
            // Manejo de excepciones
        }
    }
    /**
     * Retorna en la única instancia de la clase
     * @return Database|null
     */
    public static function getInstance()
    {
        if (self::$db === null) {
            self::$db = new self();
        }
        return self::$db;
    }
    /**
     * Crear una nueva conexión PDO basada
     * en los datos de conexión
     * @return PDO Objeto PDO
     */
    public function getDb()
    {
        if (self::$pdo == null) {
            self::$pdo = new PDO(
                'mysql:dbname=' . DATABASE .
                ';host=' . HOSTNAME .
                ';charset=utf8',
                USERNAME,
                PASSWORD,
                array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
            );
            // Habilitar excepciones
            self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        return self::$pdo;
    }
    /**
     * Evita la clonación del objeto
     */
    final protected function __clone()
    {
    }
    function _destructor()
    {
        self::$pdo = null;
    }
}
?>Meta.php
			
				B4X:
			
		
		
		<?php
/**
* Representa el la estructura de las metas
* almacenadas en la base de datos
*/
require 'Database.php';
class Meta
{
    function __construct()
    {
    }
    /**
     * Devuelve metas
     */
    public static function getAll()
    {
        $consulta = "SELECT * FROM meta";
        try {
            // Preparar sentencia
            $comando = Database::getInstance()->getDb()->prepare($consulta);
            // Ejecutar sentencia preparada
            $comando->execute();
            return $comando->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            return false;
        }
    }
    /**
     * Insertar una nueva meta
     */
    public static function insert(
        $titulo,
        $descripcion,
        $fechaLim,
        $categoria,
        $prioridad
    )
    {
        // Sentencia INSERT
        $comando = "INSERT INTO meta ( " .
            "titulo," .
            " descripcion," .
            " fechaLim," .
            " categoria," .
            " prioridad)" .
            " VALUES( ?,?,?,?,?)";
        // Preparar la sentencia
        $sentencia = Database::getInstance()->getDb()->prepare($comando);
        return $sentencia->execute(
            array(
                $titulo,
                $descripcion,
                $fechaLim,
                $categoria,
                $prioridad
            )
        );
    }
}
?>insertar_meta.php
			
				B4X:
			
		
		
		<?php
/**
* Insertar una nueva meta en la base de datos
*/
require 'Meta.php';
if ($_GET['REQUEST_METHOD'] == 'GET') {
    // Insertar meta
    $retorno = Meta::insert(
        $_GET['titulo'],
        $_GET['descripcion'],
        isset($_GET['fechaLim']) ? $_GET['fechaLim'] : date('Y-m-d'),
        $_GET['categoria'],
        $_GET['prioridad']);
    if ($retorno) {
        // Código de éxito
        $array = [
                    'estado' => 1,
                    'mensaje' => 'Creación éxitosa',
                ];
        $array2[] = $array;
        print json_encode($array2);
    } else {
        // Código de falla
        $array = [
                    'estado' => 2,
                    'mensaje' => 'Creación fallida, intentelo nuevamente.',
                ];
        $array2[] = $array;
        print json_encode($array2);
    }
}obtener_metas.php
			
				B4X:
			
		
		
		<?php
/**
* Obtiene todas las metas de la base de datos
*/
require 'Meta.php';
mb_internal_encoding('UTF-8');
if ($_GET['REQUEST_METHOD'] == 'GET') {
    // Manejar petición GET
    $metas = Meta::getAll();
    if ($metas) {
        $array1 = [
                    'estado' => 1,
                ];
        $array[] = $array1;
        foreach ($metas as $row) {
            $array[] = $row;
        }
        print json_encode($array);
   
    } else {
        $array = [
                    'estado' => 2,
                    'mensaje' => 'Ha ocurrido un error.',
                ];
        $array2[] = $array;
        print json_encode($array2);
    }
}Esos serian los archivos php los cuales se encargaran de hacer el trabajo.
*Librerías que deben usar.
*Ahora nuestro Layout y Activity en b4a que inserta los datos quedaría de la siguiente manera.
			
				B4X:
			
		
		
		Sub Process_Globals
End Sub
Sub Globals
    Private edTitulo As EditText
    Private edDescripción As EditText
    Private spPrioridad As Spinner
    Private spCategoria As Spinner
    Private ServerIP As String = "URL/insertar_meta.php"
End Sub
Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("LayoutAgregar")
    spPrioridad.AddAll(Array As String("Alta", "Media", "Baja", ""))
    spCategoria.AddAll(Array As String("Salud", "Finanzas", "Espiritual", "Profesional", "Material"))
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub btnAgregar_Click
    GetData("GET","GetMensaje")
End Sub
Sub GetData(ADD As String, sJob As String)
    If edTitulo.Text <> "" And edDescripción.Text <> "" Then
        ProgressDialogShow2("Sincronizando...", False)
        Dim GetSQL As HttpJob
        GetSQL.Initialize(sJob, Me)
        Log("prioridad "&spPrioridad.SelectedItem& " categoria "& spCategoria.SelectedItem)
        GetSQL.download2(ServerIP, Array As String ("REQUEST_METHOD", ADD, "titulo", edTitulo.Text, "descripcion", edDescripción.Text, "prioridad", spPrioridad.SelectedItem, "categoria", spCategoria.SelectedItem))
    Else
        ToastMessageShow("Debe Completar todos los campos", False)
    End If
End Sub
Sub JobDone(Job As HttpJob)
    ProgressDialogHide
    If Job.Success Then
             Dim res As String
            res = Job.GetString
            Log("Back from Job:" & Job.JobName )
            Log("Job Text: " & res)
            Dim parser As JSONParser
            parser.Initialize(res)
        Select Job.JobName
            Case "GetMensaje"
                    Dim ListMode As List
                    Dim lst As List
                    Dim estado As Int
                    lst.Initialize
                    ListMode = parser.NextArray 'returns a list with maps
                If ListMode.Size == 0 Then
                    'ToastMessageShow("No hay registros", True)
                Else
                    For i = 0 To ListMode.Size -1
                        Dim ListaData As Map
                        ListaData = ListMode.Get(i)
                            estado = ListaData.Get("estado")
                            'Log(estado)
                            ProgressDialogHide
                            If estado = 1 Then
                                ToastMessageShow(ListaData.Get("mensaje"), False)
                                edTitulo.Text = ""
                                edDescripción.Text = ""
                            End If
                            If estado = 2 Then
                                ToastMessageShow(ListaData.Get("mensaje"), False)
                            End If
                    Next
                End If
    End Select
    End If
End Sub*Ahora nuestro Layout y Activity Listar.
			
				B4X:
			
		
		
		Sub Process_Globals
End Sub
Sub Globals
    Private lwListar As ListView
    Private ServerIP As String = "http://URL/obtener_metas.php"
End Sub
Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("LayoutListar")
    CargaLista
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub CargaLista
    ProgressDialogShow2("Cargando Datos...", False)
    GetData("GET","GetLista")
End Sub
Sub GetData(ADD As String, sJob As String)
        Dim GetSQL As HttpJob
        GetSQL.Initialize(sJob, Me)
        GetSQL.download2(ServerIP, Array As String ("REQUEST_METHOD", ADD))
End Sub
Sub JobDone(Job As HttpJob)
    ProgressDialogHide
    If Job.Success Then
             Dim res As String
            res = Job.GetString
            Log("Back from Job:" & Job.JobName )
            Log("Job Text: " & res)
            Dim parser As JSONParser
            parser.Initialize(res)
        Select Job.JobName
            Case "GetLista"
                    Dim ListMode As List
                    Dim lst As List
                    Dim estado As String
                    lst.Initialize
                    ListMode = parser.NextArray 'returns a list with maps
                If ListMode.Size == 0 Then
               
                Else
                    For i = 0 To ListMode.Size -1
                        Dim ListaData As Map
                        ListaData = ListMode.Get(i)
                            estado = ListaData.Get("estado")
                            'Log(estado)
                            If estado <> 2 Then
                                If estado == "null" Then
                                    lwListar.AddSingleLine(ListaData.Get("titulo"))
                                End If
                            Else
                                ToastMessageShow(ListaData.Get("mensaje"), False)
                            End If
                            ProgressDialogHide
                    Next
                End If
    End Select
    End If
End Sub
Sub lwListar_ItemClick (Position As Int, Value As Object)
    ToastMessageShow(Position &" "& Value, False)
End Sub
Sub lwListar_ItemLongClick (Position As Int, Value As Object)
    ToastMessageShow(Position &" "& Value, False)
End SubPor ahora seria todo, cualquier consulta, error o acotación me lo dejan en un comentario.
			
				Last edited: 
			
		
	
								
								
									
	
								
							
							 
				 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		