Cómo desarrollar aplicaciones para bases de datos de Android en RAD Studio XE5

No hace mucho tiempo, RAD Studio XE5 introdujo soporte para el desarrollo de aplicaciones Android. En Internet se puede encontrar mucha información sobre el desarrollo de aplicaciones Android en Delphi XE5, pero cuando se trata de desarrollar aplicaciones de bases de datos, se vuelve mucho más complicado. El hecho es que los componentes y controladores incluidos en la distribución RAD Studio XE5 (como los controladores FireDAC y dbExpress) tienen serias limitaciones: en las plataformas Android e iOS, solo admiten 2 bases de datos: SQLite e InterBase. ¿Y si está desarrollando una aplicación comercial seria que requiere una conexión remota a Oracle, MySQL o PostgreSQL con Android? Nos hemos encontrado con estos problemas en varios foros dedicados al desarrollo de aplicaciones de bases de datos para Android, y decidimos revelar este tema con el mayor detalle posible.

Índice

    Componentes

    Comencemos con una descripción de los componentes que usaremos:

    • UniDAC es un componente de acceso a datos universal que le permite conectarse a SQLite, Oracle, MySQL, PostgreSQL e InterBase con Android (puede usar UniDAC para conectarse con Windows a casi todas las bases de datos conocidas, pero esto está más allá del alcance de este blog).

    Si desea trabajar no con todas estas bases de datos, sino con una de ellas, puede usar componentes más específicos:

    • LiteDAC: componentes de acceso a datos de SQLite
    • ODAC: componentes de acceso a datos de Oracle
    • MyDAC - componentes de acceso a datos MySQL
    • PgDAC - componentes de acceso a datos PostgreSQL
    • IBDAC - Componentes de acceso a datos de InterBase

    Todos estos componentes también son compatibles con Android como plataforma de destino en RAD Studio XE5.

    Conexión de base de datos

    Trabajar con bases de datos en Android en general no es diferente de trabajar con Windows, pero existen algunos matices al configurar una conexión y la implementación de archivos en un dispositivo móvil si está trabajando con una base de datos local. Aquí veremos cómo conectarse a cada base de datos admitida.

    SQLite

    Si no implementa el archivo de la base de datos en su dispositivo móvil, debe instalar:

    ForceCreateDatabase := True

    En este caso, la primera vez que ejecute la aplicación, el archivo de la base de datos se creará automáticamente.

    Patrón LiteDAC

    var
      Connection: TLiteConnection;
    begin
      Connection := TLiteConnection.Create(nil);
      try
        Connection.Options.ForceCreateDatabase := True;
        Connection.Base de datos := IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'db.sqlite3';
        Connection.Connect;
      finally
        Connection.Free;
      end;
    end;

    Patrón UniDAC

    var
      Connection:  TUniConnection;
    begin
      Connection := TUniConnection.Create(nil);
      try
        Connection.ProviderName := 'SQLite';
        Connection.SpecificOptions.Values['ForceCreateDatabase'] := 'True';
        Connection.Base de datos := IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'db.sqlite3';
        Connection.Connect;
      finally
        Connection.Free;
      end;
    end;

    Oráculo

    No es posible instalar el cliente de Oracle en un dispositivo móvil porque el cliente de Oracle para Android simplemente no existe. Por lo tanto, la única forma de conectarse a Oracle desde un dispositivo móvil es conectarse directamente a través de TCP/IP. Para hacer esto, el parámetro Directo debe establecerse en True:

    Direct := True;

    Además, el nombre del servidor debe generarse correctamente, ya que si no tenemos un cliente, tampoco tenemos un archivo tnsnames.ora con una lista de servidores. Entonces, para conectarnos a Android, necesitamos conocer el host y el puerto del servidor, así como su SID o nombre de servicio.

    Para conectarse a través de SID, el servidor debe instalarse de la siguiente manera:

    Server := 'Host:Port:sid=SID';

    o de forma simplificada:

    Server := 'Host:Port:SID';

    Para conectarse a través del nombre del servicio, de la siguiente manera:

    Server := 'Host:Port:sn=SID';

    En otras palabras, el prefijo 'sid =' del tercer parámetro indica que la conexión se establece a través de SID, y el prefijo 'sn =' indica que la conexión se establece a través del Nombre del Servicio. Si no se especifica el prefijo, por defecto se supone que queremos establecer una conexión a través de SID.

    La mayoría de los servidores de Oracle tienen el mismo SID y el mismo nombre de servicio, por lo que probablemente no tendrá que entrar en esos matices, ya que puede obtener más información en la documentación de Oracle.

    patrón ODAC

    var
      Session:  TOraSession;
    begin
      Session := TOraSession.Create(nil);
      try
        Session.Options.Direct := True;
        Session.Server := 'server:1521:orcl';
        Session.Username := 'user_name';
        Session.Password := 'password';
        Session.Connect;
      finally
        Session.Free;
      end;
    end;

    Patrón UniDAC

    var
      Connection:  TUniConnection;
    begin
      Connection := TUniConnection.Create(nil);
      try
        Connection.ProviderName := 'Oracle';
        Connection.SpecificOptions.Values['Direct'] := 'True';
        Connection.Server := 'server:1521:orcl';
        Connection.Username := 'user_name';
        Connection.Password := 'password';
        Connection.Connect;
      finally
        Connection.Free;
      end;

    mysql

    El software de cliente MySQL para Android tampoco existe, por lo que la conexión con el servidor MySQL también se establecerá directamente a través de TCP/IP. Para hacer esto, configure la opción apropiada:

    Direct := True;

    Ejemplo de MyDAC

    var
      Connection:  TMyConnection;
    begin
      Connection := TMyConnection.Create(nil);
      try
        Connection.Options.Direct := True;
        Connection.Server := 'server';
        Connection.Port := 3306;
        Connection.Base de datos := 'database_name';
        Connection.Username := 'user_name';
        Connection.Password := 'password';
        Connection.Connect;
      finally
        Connection.Free;
      end;
    end;

    Patrón UniDAC

    var
      Connection:  TUniConnection;
    begin
      Connection := TUniConnection.Create(nil);
      try
        Connection.ProviderName := 'MySQL';
        Connection.SpecificOptions.Values['Direct'] := 'True';
        Connection.Server := 'server';
        Connection.Port := 3306;
        Connection.Base de datos := 'database_name';
        Connection.Username := 'user_name';
        Connection.Password := 'password';
        Connection.Connect;
      finally
        Connection.Free;
      end;
    end;

    postgresql

    Con PostgreSQL todo es más fácil. Como PgDAC y UniDAC permiten establecer una conexión directa solo a través de TCP/IP, basta con que especifiquemos el servidor y el puerto y ejecutemos Connect.

    Muestra de PgDAC

    var
      Connection:  TPgConnection;
    begin
      Connection := TPgConnection.Create(nil);
      try
        Connection.Server := 'server';
        Connection.Port := 5432;
        Connection.Base de datos := 'database_name';
        Connection.Schema := 'schema_name';
        Connection.Username := 'user_name';
        Connection.Password := 'password';
        Connection.Connect;
      finally
        Connection.Free;
      end;
    end;

    Patrón UniDAC

    var
      Connection:  TUniConnection;
    begin
      Connection := TUniConnection.Create(nil);
      try
        Connection.ProviderName := 'PostgreSQL';
        Connection.Server := 'server';
        Connection.Port := 5432;
        Connection.Base de datos := 'database_name';
        Connection.SpecificOptions.Values['Schema'] := 'schema_name';
        Connection.Username := 'user_name';
        Connection.Password := 'password';
        Connection.Connect;
      finally
        Connection.Free;
      end;
    end;

    interbase

    Con InterBase ToGo, puede conectarse a bases de datos locales y remotas.

    Para conectarse a una base de datos local, simplemente configure la ruta a la base de datos local en el dispositivo:

    Base de datos := IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'db.gdb';

    Si necesita conectarse a un servidor remoto, debe especificar no solo la base de datos sino también el servidor:

    UniConnection.Server := 'server';
    UniConnection.Base de datos := 'C:db.gdb';

    Tenga en cuenta que se debe especificar el prefijo IncluirTrailingPathDelimiter (TPath.GetDocumentsPath) al conectarse a una base de datos local y no es necesario para conectarse a una base de datos remota.

    Ejemplo de base de datos IBDAC local

    var
      Connection:  TIBCConnection;
    begin
      Connection := TIBCConnection.Create(nil);
      try
        Connection.Base de datos := IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'db.gdb';
        Connection.Username := 'user_name';
        Connection.Password := 'password';
        Connection.Connect;
      finally
        Connection.Free;
      end;
    end;

    Ejemplo de base de datos IBDAC remota

    var
      Connection:  TIBCConnection;
    begin
      Connection := TIBCConnection.Create(nil);
      try
        Connection.Server := 'server';
        Connection.Base de datos := 'C:db.gdb';
        Connection.Username := 'user_name';
        Connection.Password := 'password';
        Connection.Connect;
      finally
        Connection.Free;
      end;
    end;

    Ejemplo de base de datos UniDAC local

    var
      Connection:  TUniConnection;
    begin
      Connection := TUniConnection.Create(nil);
      try
        Connection.ProviderName := 'InterBase';
        Connection.Base de datos := IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'db.gdb';
        Connection.Username := 'user_name';
        Connection.Password := 'password';
        Connection.Connect;
      finally
        Connection.Free;
      end;
    end;

    Ejemplo de base de datos UniDAC remota

    var
      Connection:  TUniConnection;
    begin
      Connection := TUniConnection.Create(nil);
      try
        Connection.ProviderName := 'InterBase';
        Connection.Server := 'server';
        Connection.Base de datos := 'C:db.gdb';
        Connection.Username := 'user_name';
        Connection.Password := 'password';
        Connection.Connect;
      finally
        Connection.Free;
      end;
    end;

    Implementar en un dispositivo móvil

    Para que nuestra aplicación funcione con las bases de datos locales SQLite e InterBase ToGo, debemos asegurarnos de que estas bases de datos estén implementadas en un dispositivo Android. No hay nada complicado en esto, ya que el proceso de implementación es similar en Delphi XE4 y Delphi XE5. Primero necesitamos llamar al menú Proyecto-> Despliegue:

    Luego agregue nuestras bases de datos SQLite e InterBase a la lista de archivos que se implementarán en su dispositivo Android junto con su aplicación:

    Tenga en cuenta que la ruta de implementación es diferente para Android e iOS. Si desea implementar su aplicación en ambas plataformas, asegúrese de que las rutas de implementación estén marcadas correctamente para ambas.

    NOTA: Recuerde cambiar el valor predeterminado de la ruta remota. con uno de los anteriores.

    Ruta de implementaciónDestino en el dispositivo
    TPath.GetDocumentsPath.activosdentro/data/data/com.embarcadero.MyProjects/files
    TPath.GetSharedDocumentsPath. activos/mnt/sdcard/Android/data/com.embarcadero.MyProjects/files

    depuración

    No nos centraremos en el proceso de depuración en este artículo, ya que se describió en detalle en el artículo anterior: depuración remota de aplicaciones de Android en RAD Studio XE5 a través de Wi-Fi

    Conclusión

    Actualmente, con el lanzamiento de RAD Studio XE5, los componentes de acceso a datos de Devart le permiten conectarse a SQLite, Oracle, MySQL, PostgreSQL e InterBase desde ambas plataformas móviles: Android e iOS. Pero no vamos a parar. Muchos usuarios nos piden que admitamos la conexión a SQL Server con Android e iOS, y haremos todo lo posible para brindarles esa oportunidad.

    Actualizar

    Nos complace anunciar que admitimos la conexión a SQL Server y SQL Azure con iOS y Android.

    Artículos de interés

    Subir