Existen 3 enfoques para usar Bases de Datos◦ 1.Base de Datos Interna (SQLite)◦ 2.Java JDBC◦ 3.Servicios WEB
Bases de datos
No requiere conexión de red Mucho más rápido No requiere seguridad
BD interna SQLite
BD interna SQLite (cont.)
ODMS
11g
DBMS
Servidor
Smartphone
SQLite
Conexión on-line Cualquier DBMS (se requiere driver jdbc) Se requiere tener abiertos los puertos Recomendable para Intranet Usar VPN
JDBC
JDBC (cont.)
Smartphone
DBMS
Servidor
Driver JDBC
Se conectan a cualquier DBMS Los servicios se pueden desarrollar en
cualquier lenguaje y arquitectura Normalmente se usa HTTP Se puede usar SSL
Servicios WEB
Intercambiar datos entre aplicaciones que no necesariamente estan en el mismo lenguaje, sistema operativo o geografia.
SOAP REST
Servicios WEB
Servicios WEB
Smartphone
DBMS
Servidor
HTTPSOAPREST WEB
Open Source Estandar sintaxis SQL Requiere poca memoria 250 kBytes Es transaccional ORM básico para CRUD
SQLite
TEXT => String INTEGER => long REAL => double Otros tipos de datos necesitan ser
convertidos No se hace validación de tipos de datos
Mapeo de Campos
android.database.sqlite.* SQLiteOpenHelper Método construcctor Métodos abstractos onCreate() y
onUpgrade() SQLiteDatabase Métodos insert(), update(), delete() execSQL(), rawQuery y otros
API SQLite
Se crea una Clase Helper para administrar la base de datos
Se crea una clase DAO para administrar los registros de una tabla
Implementación
Esquema ORMSQLiteOpenHelper constructor()
onCreate()onUpdate()
SQLiteDatabaseinsert()delete()update()execSQL()query()rawQuery()
DAOopen()close()CRUD…
Modelogetters()setters()
SQLite Administrator No necesita instalación www.yesdel.com/elfec/sqliteadmin.zip
Administrador SQLite
sqlite3 archivo.db .schema tabla PRAGMA table_info(tabla) .tables .help
Comandos
SQLite ListActivity CursorAdapter Menu Menu Contextual Intent’s Preferencias
Ejemplo
1. Implementar getAll() con orderby, getById() y con _id
2. Implementar Holder 3. Implementar CursorAdapter 4. Implementar principal con ListActivity 5. Implementar Actividad Detalle 6. Implementar onMenuItemSelected() 7. Implementar Intent 8. Implementar interface
OnItemLongClickListener y onItemLongClick()
Pasos
9. Implementar registerForContextMenu(), onCreateContextMenu() con setHeaderTitle()
10. Implementar onContextItemSelected() 11. Implementar XML preferencias 12. Implementar PreferenceActivity con
addPreferencesFromResource() 13. Implementar SharedPreferences con
PreferenceManager.getDefaultSharedPreferences y
registerOnSharedPreferenceChangeListener
Pasos (cont.)
SQLiteDatabase.beginTransaction()
SQLiteDatabase.setTransactionSuccessful()
SQLiteDatabase.endTransaction()
Transacciones
Interfaz estandar para conexion a bases de datos relacionales desde Java
Es un Java API para ejecutar SQL Clases e interfaces estan en java.sql
JDBC
JDBC ClasesDriverManager
Driver
Connection
Statement
ResultSet
Architectura JDBC
Applicación JDBC Driver
Class.forName(“oracle.jdbc.driver.OracleDriver”);
Connection c = DriverManager.getConnection(...);
Registrar un Driver
jdbc:subprotocolo:fuente Cada driver tiene su propio subprotocolo Cada subprotocolo tiene su propia sintaxis Ej: Jdbc:odbc:bdaccess Jdbc:msql://host[:port]/bd
URL JDBC
Mysql com.mysql.jdbc.Driver 3306 jdbc:mysql://[host][:port]/[database] PostgreSQL org.postgresql.Driver 5432 jdbc:postgresql://host:port/database SQL Server
com.microsoft.jdbc.sqlserver.SQLServerDriver 1433
jdbc:microsoft:sqlserver://host:port;db=db;user=;password=
Oracle oracle.jdbc.driver.OracleDriver 1521
jdbc:oracle:thin:@host:port:sid
URL comunes
Connection getConnection (String url, String usuario, String clave)
Ejemplo Class.forName("oracle.jdbc.driver.OracleDriver"); String url = "jdbc:oracle:thin:@192.168.2.1:1521:dev";
this.conn = DriverManager.getConnection(url,"","");
DriverManager
Statement createStatement() PreparedStatement prepareStatement(String sql)
CallableStatement prepareCall(String sql)
Metodos de Conexión
Se usa para ejecutar un SQL ResultSet executeQuery(String) int executeUpdate(String) boolean execute(String)
Statement
Provee acceso a los datos de la tabla El metodo next() mueve a la siguiente fila El metodo close() libera la memoria
ResultSet
CallableStatement proc=null; proc = conn.prepareCall("{ call procedimiento(?, ?) }"); proc.setString(1, var1); proc.setInt(2, var2); proc.execute();
Store Procedures
conn.setAutoCommit(false);
conn.commit();
conn.rollback();
Transacciones
Mapeo de Tipos de DatosSQL JavaCHAR, VARCHAR, LONGVARCHAR StringNUMERIC, DECIMAL BigDecimalBIT booleanTINYINTbyteSMALLINT shortINTEGER intBIGINT longREAL floatFLOAT, DOUBLEdoubleBINARY, VARBINARY, LONGVARBINARY byte[]DATE java.sql.DateTIME java.sql.TimeTIMESTAMP java.sql.Timestamp
<uses-permission android:name="android.permission.INTERNET"/>
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll() .build(); StrictMode.setThreadPolicy(policy);
Seguridad Android
Content Providers Compartir datos entre aplicaciones Arquitectura Cliente-Servidor ContentResolver provee el API para el
cliente ContentProvider es el servidor
Proveedores de Contenido
Acceso mediante URI content://com.elfec.agenda/persona/23 Prefix: content:// Authority: com.elfec.agenda Entity: persona Identifier: 23
URI
Paquete android.provider.* Definir un ContentResolver Inicializar con getContentResolver() Usar CRUD (insert, query, update, delete)
Cliente
Contactos => ContactsContract.Contacts Llamadas => CallLog.Calls Eventos => CalendarContract.Events Imagenes=> MediaStore.Images.Media Archivos => MediaStore.Files SMS => “content://sms/” SMS => “content://sms/inbox”
Ejemplos ContentProvider
Heredar de ContentProvider Implementar CRUD onCreate() query() insert() update() delete() getType()
Servidor