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.
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ón | Destino 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