Download - BlackBerry DevCon 2011 - COM34
Aplicaciones orientadas a datos en BlackBerry PlayBook
Mariano Carrizo
COM34
Octubre 18 - 20, 2011
Agenda
Descarga simple de datos Flex data components Protocolo AMF Remote Objects Sistema de archivos Bases de datos
@kiwox– 2
Descarga simple de datos
URLLoader
URLLoaderEl Camino Simple
Clase nativa ActionScript 3 Permite la descarga de contenidos en varios formatos
Text URL encoded variables Binary
Informa el progreso de descarga URLLoader.bytesLoaded URLLoader.bytesTotal
Dispone los datos una vez completada la descarga
@kiwox– 4
URLLoaderEjemplo
protected var ldr:URLLoader;
protected function loadData():void {ldr = new URLLoader();ldr.addEventListener(Event.COMPLETE, onDataComplete);ldr.addEventListener(IOErrorEvent.IO_ERROR, onError);try {
ldr.load(new URLRequest("datos.php"));} catch(e:Error) {
trace("Error al descargar datos");}
}@kiwox– 5
URLLoaderEjemplo
protected function onDataComplete(event:Event):void {trace(ldr.data);
}
protected function onError(event:IOErrorEvent):void {trace("Error: "+event.errorID);
}
@kiwox– 6
URLLoaderDatos en Formato XML
protected var xmlData:XML;
protected function onDataComplete(event:Event):void {xmlData = XML(ldr.data);for(var i:String in xmlData.item) {
trace(xmlData.item[i].titulo);}
}
@kiwox– 7
URLLoaderDatos en Formato Binario
ldr = new URLLoader();ldr.dataFormat = URLLoaderDataFormat.BINARY;ldr.addEventListener(Event.COMPLETE, onDataComplete);ldr.addEventListener(IOErrorEvent.IO_ERROR, onError);ldr.addEventListener(ProgressEvent.PROGRESS, onProgress);
try {ldr.load(new URLRequest("imagen.png"));
} catch(e:Error) {trace("Error al descargar imagen");
}
@kiwox– 8
Flex Data Components
Abstrayendo Las Tareas
Flex data componentsAbstrayendo Las Tareas
Simplifican la intermediación con el servidor Disponen los datos listos para usarlos Admiten formatos más complejos
XML JSON AMF Objeto/Array
Permiten enlazar a componentes visuales List, TextArea, etc.
@kiwox– 10
Flex data componentsHTTPService
Obtiene datos directos de estilo REST Inicia la llamada con el método send() El resultado estará disponible en la propiedad lastResult
@kiwox– 11
Flex data componentsHTTPService
<fx:Declarations><s:HTTPService id="servicio"
url="miServicio.php" /></fx:Declarations>
<s:Button label="Descargar" click="servicio.send()" />
<s:List dataProvider="{servicio.lastResult.rss.channel.item}" />
@kiwox– 12
Flex data componentsWebService
Interactúa con servicios WSDL Soporta protocolo SOAP Permite el envío de parámetros a métodos específicos Los resultados pueden ser enlazados o esperados en
métodos callBack Podemos configurar cada operación con elementos
<s:operation>
@kiwox– 13
Flex data componentsWebService
<s:WebService id="servicio" wsdl="http://ws.invesbot.com/stockquotes.asmx?WSDL">
<s:operation name="GetQuote" resultFormat="object" result="quoteResultHandler(event)">
<s:request><symbol>SYMBOL</symbol>
</s:request></s:operation>
</s:WebService>
@kiwox– 14
Demo
Acceso a Datos Remotos
@kiwox– 15
Protocolo AMF
Transferencia Binaria de Datos
Protocolo AMFTransferencia Binaria de Datos
Active Message Format Formato nativo ActionScript
ActionScript 2: AMF0 ActionScript 3: AMF3
Soporta datos primitivos y compuestos String, Number, Null, Boolean… Object, Array, XML, ByteArray Objetos personalizados (ValueObjects)
@kiwox– 17Especificación AMF3: http://goo.gl/b3qbk
Protocolo AMFTransferencia Binaria de Datos
Desde ActionScript utilizando NetStream En conjunto con Flash Media Server bajo protocolo rtmp:/ Permite instanciar objetos remotos (servidor) Soporte disponible en la mayoría de servidores
@kiwox– 18
Protocolo AMFTransferencia Binaria de Datos
var netConnection:NetConnection = new NetConnection();var responder:Responder = new Responder();netConnection.connect(“http://localhost/Amfphp/”);netConnection.call(“DataService/getRecords”, responder);
@kiwox– 19
Remote Objects
@kiwox– 20
Ser
vido
r
Clases PHP
<s:RemoteObject id="servicio” fault="faultHandler(event)” showBusyCursor="true” destination="zend" />
servicio.getAll()
ObjectVO[]
Remote Objectsservices-config.xml
@kiwox– 21
<services-config> <services> <service id="zend-service" class="flex.messaging.services.RemotingService” messageTypes="flex.messaging.messages.RemotingMessage"> <destination id="zend"> <channels> <channel ref="zend-endpoint"/> </channels> <properties> <source>*</source> </properties> </destination> </service> </services> <channels> <channel-definition id="zend-endpoint” class="mx.messaging.channels.AMFChannel"> <endpoint uri="http://example.com/server.php” class="flex.messaging.endpoints.AMFEndpoint"/> </channel-definition> </channels></services-config>
Persistencia de Datos
Almacenamiento en el Dispositivo
Sistema de Archivos
File Localiza y resuelve punteros a archivos Permite consultar propiedades y existencia
FileStream Flujo de lectura/escritura de datos
Sistema de Archivos
@kiwox– 24
Localizar Recurso
Crear Flujo de Datos
Leer Datos Cerrar Flujo
Sistema de Archivos
@kiwox– 25
Localizar Recurso
Crear Flujo de Datos
Escribir Datos Cerrar Flujo
Sistema de archivos
@kiwox– 26
var archivo:File = File.documentsDirectory.resolvePath(“datos/listado.xml”);
if(archivo.exists) {…
}
Directorios
File.applicationDirectory <appDir>/app/air/
File.applicationStorageDirectory <appDir>/data/
File.documentsDirectory File.desktopDirectory
/shared/documents/
@kiwox– 27
FileStream
@kiwox– 28
var fs:FileStream = new FileStream();fs.open(archivo, FileMode.READ)
FileMode.READFileMode.WRITEFileMode.APPENDFileMode.UPDATE
FileStream
@kiwox– 29
var datos:File = File.applicationStorageDirectory.resolvePath("datos.txt");
var fs:FileStream = new FileStream();
fs.open(datos, FileMode.WRITE);
try {
fs.writeUTFBytes("Hola mundo");
} catch(e:Error) {
trace("Error escribiendo");
}
fs.close();
FileStream
@kiwox– 30
var datos:File = File.applicationStorageDirectory.resolvePath("datos.txt");
var fs:FileStream = new FileStream();
fs.addEventListener(Event.COMPLETE, completeHandler);
fs.openAsync(datos, FileMode.READ);
var str:String = "";
function completeHandler(event:Event):void {
str = fs.readUTFBytes(fs.bytesAvailable);
}
FileStream
@kiwox– 31
var datos:File = File.applicationStorageDirectory.resolvePath("datos.txt");
var fs:FileStream = new FileStream();
fs.addEventListener(ProgressEvent.PROGRESS, progressHandler);
fs.addEventListener(Event.COMPLETE, completeHandler);
fs.openAsync(datos, FileMode.READ);
var str:String = "";
function progressHandler(event:ProgressEvent):void {
str += fs.readUTFBytes(fs.bytesAvailable);
}
function completeHandler(event:Event):void {
trace("Datos listos");
}
Bases de Datos
SQLite en Adobe AIR
@kiwox– 32
SQLite
SQLConnection Objeto conector Localiza el recurso y maneja las transacciones
@kiwox– 33
SQLite
@kiwox– 34
var conn:SQLConnection = new SQLConnection(); conn.addEventListener(SQLEvent.OPEN, openHandler); conn.addEventListener(SQLErrorEvent.ERROR, errorHandler); var folder:File = File.applicationStorageDirectory; var dbFile:File = folder.resolvePath("DBSample.db"); conn.openAsync(dbFile); function openHandler(event:SQLEvent):void { trace(”Base de datos abierta"); } function errorHandler(event:SQLErrorEvent):void { trace(“Error:”, event.error.message); trace(“Detalles:”, event.error.details); }
SQLite
@kiwox– 35
var conn:SQLConnection = new SQLConnection(); var folder:File = File.applicationStorageDirectory; var dbFile:File = folder.resolvePath("DBSample.db"); try { conn.open(dbFile); trace(”Base de datos abierta"); } catch (error:SQLError) { trace("Error:", error.message); trace(”Detalles:", error.details); }
SQLite
SQLStatement Transacciones individuales Pueden ser asincrónicas
@kiwox– 36
SQLite
@kiwox– 37
var createStmt:SQLStatement = new SQLStatement(); createStmt.sqlConnection = conn; var sql:String = "CREATE TABLE IF NOT EXISTS employees (" + " empId INTEGER PRIMARY KEY AUTOINCREMENT, " + " firstName TEXT, " + " lastName TEXT, " + " salary NUMERIC CHECK (salary > 0)" + ")"; createStmt.text = sql; createStmt.addEventListener(SQLEvent.RESULT, createResult); createStmt.addEventListener(SQLErrorEvent.ERROR, createError); createStmt.execute();
SQLite
@kiwox– 38
conn.open(dbFile, OpenMode.UPDATE); conn.begin(); var insertCustomer:SQLStatement = new SQLStatement(); insertCustomer.sqlConnection = conn;
insertCustomer.text = "INSERT INTO customers (firstName, lastName) " + "VALUES ('Bob', 'Jones')";
insertCustomer.execute();
var customerId:Number = insertCustomer.getResult().lastInsertRowID;
conn.commit();
SQLite
@kiwox– 39
var insertPhoneNumber:SQLStatement = new SQLStatement(); insertPhoneNumber.sqlConnection = conn;
insertPhoneNumber.text = "INSERT INTO customerPhoneNumbers (customerId, number) " + "VALUES (:customerId, '800-555-1234')";
insertPhoneNumber.parameters[":customerId"] = customerId;
insertPhoneNumber.execute(); conn.commit();
SQLite
@kiwox– 40
try {var insertPhoneNumber:SQLStatement = new SQLStatement(); insertPhoneNumber.sqlConnection = conn;
insertPhoneNumber.text = "INSERT INTO customerPhoneNumbers (customerId, number) " + "VALUES (:customerId, '800-555-1234')";
insertPhoneNumber.parameters[":customerId"] = customerId;
insertPhoneNumber.execute(); conn.commit(); } catch (error:SQLError) { conn.rollback(); }
SQLite
Bases de datos encriptadas Utilizan una llave en formato ByteArray
@kiwox– 41
public function open(reference:Object = null, openMode:String = "create", autoCompact:Boolean = false, pageSize:int = 1024, encryptionKey:ByteArray = null):void
SQLite
@kiwox– 42
var conn:SQLConnection = new SQLConnection(); var encryptionKey:ByteArray = new ByteArray(); encryptionKey.writeUTFBytes(”CadenaDe16Bytes"); conn.openAsync(dbFile, SQLMode.CREATE, null, false, 1024, encryptionKey);
Demo
Manejo de Datos
@kiwox– 43
Más Información…
Recursos Adobe DevNet: http://www.adobe.com/devnet/devices.html Tour de Flex: http://www.adobe.com/devnet/flex/tourdeflex.html Adobe TV: http://tv.adobe.com/ Libro Flex 4.5: http://goo.gl/RcKXJ
@kiwox– 44
¡Muchas Gracias!
Mariano Carrizo
COM34
Octubre 18 - 20, 2011