Você está na página 1de 17

Analice servicios basados en la nube para

aplicaciones de Android
Almacenamiento en la nube y consulta de usuarios,
objetos de datos y archivos en sus aplicaciones Android
C. Enrique Ortiz
Developer and author
Independent

Nivel de dificultad: Intermediaria


Fecha: 06-05-2013

Explore las ventajas de almacenar datos de aplicaciones mviles en nube privada


con esta introduccin a Parse SDK para Android. El desarrollador de tecnologa
mvil C. Enrique Ortiz presenta las clases Parse API para almacenamiento
en nube y manipulacin de usuarios, objetos de datos y archivos para sus
aplicaciones mviles.
Parse mobile SDK proporciona APIs y servicios basados en nube para aplicaciones
iOS, Android y Windows . Parse SDK tambin proporciona APIs JavaScript y
REST. Al usar Parse API, usted puede habilitar en la nube sus aplicaciones mviles
muy rpidamente y con un esfuerzo mnimo. Una aplicacin mvil que est integrada
con Parse API puede almacenar objetos de datos y archivos fcilmente en la nube
Parse, enviar y recibir notificaciones de push, gestionar usuarios, manejar datos
de geo-ubicacin y usar plataformas de medios sociales como Twitter y Facebook.
Para las aplicaciones mviles que necesitan escalarse, Parse SDK ofrece toda la
elasticidad de una plataforma de nube.
Antes de comenzar
Supongo que para propsitos de este artculo usted ya est familiarizado
con los conceptos bsicos que se requieren para programar aplicaciones
mviles con JSON, Android, y Eclipse. Antes de leer ms vaya a
Parse.com y defina su aplicacin. Simplemente siga las sencillas
instrucciones que inician desde la pgina de inicio de sesin.

Este artculo presenta las clases centrales de Parse API para usuarios Parse,
objetos de datos y archivos. Usted aprender cmo trabajar con listas de control
de acceso (ACLs) y cmo realizar operaciones CRUD en objetos de datos, y cmo
almacenar y recuperar archivos en la nube Parse. Los ejemplos estn incorporados
en Parse SDK for Android (ver Recursos).
Copyright IBM Corporation 2013
Analice servicios basados en la nube para aplicaciones
de Android

Marcas
Pagina 1 de 17

developerWorks

ibm.com/developerWorks/ssa/

El panel de instrumentos de Parse


El panel de instrumentos de Parse ayuda a los desarrolladores a gestionar
aplicaciones. El panel de instrumentos proporciona mtricas de uso general y
especficas de aplicacin para APIs, archivos y notificaciones push. Las claves
y valores de la aplicacin se gestionan va el panel de instrumentos. El panel
de instrumentos tambin proporciona un navegador de datos que permite a los
desarrolladores navegar e incluso editar objetos Parse almacenados. El navegador
de datos es muy til data para depurar. La Figura 1 es una captura de pantalla del
panel de instrumentos de Parse:
Figura 1. El panel de instrumentos de Parse

Las aplicaciones son autenticadas va un ID de aplicacin y un ID de cliente. Para


obtener su ID de aplicacin y de cliente, usted debe registrar su aplicacin va
el panel de instrumentos de Parse. Usted usar estas claves cuando inicialice la
bilbioteca Parse en su aplicacin.

Objetos de datos Parse


En Parse, los datos son representados usando ParseObject, un contenedor de pares
de nombre-valor. ParseObject puede almacenar cualquier dato que sea compatible
con JSON, como se muestra en el Listado 1:
Listado 1. Un ejemplo de ParseObject
ParseObject myParseObject = new ParseObject("MyObject"); // Class Name
myParseObject.put("name", "C. Enrique Ortiz");
myParseObject.put("twitterHandle", "eortiz");
myParseObject.put("followers", 123456);

A ParseObject se le da un classname cuando se instancia. El classname en el


Listado 1 es "MyObject." Classnames son como nombres de tabla en una base

de
datos relacional, y los objetos Parse de la misma clase son como filas dentro de una
tabla.
Analice servicios basados en la nube para aplicaciones
de Android

Pagina 2 de 17

ibm.com/developerWorks/ssa/

ParseObject expone mtodos similares a los que


Map , como put, httpy remove, ms diversos otros
ParseObject.

developerWorks

se encuentran en la clase de Java


mtodos que son especficos para

son claves de nombre que deben ser alfanumrica; como gua, use
bicapitalizacin para las claves de nombre. Los valores pueden ser de cualquier
tipo de datos que puedan almacenarse en JSON; esto es, nmeros, cadenas de
caracteres, booleanos, arrays, JSONObject.NULL, JSONObjects y JSONArrays. Otros
tipos de datos con soporte de ParseObject son arrays Java Date y byte[] . Un
ParseObject puede incluir tambin otros ParseObjects.
ParseObject

El Listado 2 muestra algunos de los tipos de datos de valor ParseObject con


soporte:
Listado 2. ParseObject: Algunos tipos de datos de valor con soporte
// Byte Array
byte[] byteArray = {1, 2, 3, 4, 5};
// A date
Date d = new Date(); // java.util.Date
// A number
int number = 21;
// A String
String name = "Enrique";
// A JSONArray - any mix of JSONObjects, JSONArrays, Strings, Booleans,
//
Integers, Longs, Doubles, null or NULL.
JSONArray jArray = new JSONArray();
jArray.put(number);
jArray.put(name);
// A JSONObject
JSONObject jObject = new JSONObject();
try {
jObject.put("number", number);
jObject.put("name", name);
} catch (JSONException e) {
e.printStackTrace();
}
// A ParseObject
ParseObject pObject = new ParseObject("MyObject"); // Class name
pObject.put("myByteArray", byteArray);
pObject.put("myDate", d);
pObject.put("myString", name);
pObject.put("myNumber", number);
pObject.put("myJsonArray", jArray);
pObject.put("myJsonObject", jObject);
pObject.put("myNull", JSONObject.NULL);

El cdigo en el Listado 2 crea un ParseObject que es almacenado como un objeto


en la nube Parse. Muchos MyObjects de la misma clase son posteriormente
almacenados como filas de objetos de datos ParseObject que pueden ser
guardados, consultados, actualizados, y suprimidos del almacenamienot de la nube
de Parse. Es incluso posible guardar datos cuando la aplicacin est offline la
Analice servicios basados en la nube para aplicaciones
de Android

Pagina 3 de 17

developerWorks

ibm.com/developerWorks/ssa/

bilbioteca Parse simplemente guarda los datos localmente hasta que haya sido
restablecida una conexin.
Modificando un ParseObject
Si usted est familiarizado con el desarrollo de aplicaciones mviles, entonces usted
sabe qu operaciones largas como operaciones de red deben realizarse tpicamente
en segundo plano, en una hebra de trabajador y no en la hebra de sistema principal
UI. Esto previene que la hebra de sistema principal bloquee y afecte el grado de
respuesta de su interfaz de usuario. Ms adelante en el artculo, les mostrar cmo
los recursos Parse trabajan en plano de fondo para guardar, suprimir y encontrar
objetos. Por ahora, considere el siguiente mtodo sincrnico remove() , que es
usado para remover una clave de un objeto Parse:
pObject.remove("myNumber"); // remove the field/key "myNumber" from pObject

Despus de remover o adcionar campos, o actualizar un campo actual, usted puede


guardar (o actualizar) el objeto de datos en la nube al llamar uno de los mtodos
ParseObject's save...() , que discuto posteriormente en el artculo.
Resumen: ParseObject
ParseObject representa un objeto de datos en la nube Parse.
Proporciona mtodos para aadir pares nombre-valor, prueba si una
clave dada est presente, y suprimir o captar un ParseObject dado
del servidor. ParseObject tambin le permite usar diversos mtodos
get...() y put...() para manipular datos ParseObject , fusionar
ParseObjects, guardar un ParseObject en el servidor, y ms.

Usuarios Parse, papeles, y ACLs


Antes de mostrar cmo realizar operaciones CRUD en un objeto Parse, debe saber
algunas cosas acerca de los usuarios Parse, papeles, y ACLs (listas de control
de acceso). Los tres son muy importantes conceptos y recursos para proteger los
objetos de datos de su aplicacin.
Usuarios Parse
Una clase llamada ParseUser representa un usuario y proporciona funcionalidad
de usuario-cuenta para aplicaciones Parse. Cada aplicacin Parse tiene a usuarios
Parse asociados con ella. Un ParseUser es un ParseObject pero con las propiedades
adicionales de username, password, y email. Usted puede aadir cualquier valor de
datos adicional conforme lo considere conveniente.
Usuarios annimos en Parse
Un usuario annimo en Parse es uno sin nombre de usuario o contrasea.
Los usuarios annimos son tiles para funcionalidad de aplicacin mvil
que no requiera autenticacin de usuario. Los usuarios annimos pueden
crear objetos de datos, pero dichos objetos tiene una vida corta y no
estarn disponibles una vez que el usuario annimo realice el log-out.

Analice servicios basados en la nube para aplicaciones


de Android

Pagina 4 de 17

ibm.com/developerWorks/ssa/

developerWorks

Los usuarios pueden iniciar sesin como usuarios Parse de su aplicacin, como se
muestra en elListado 3:
Listado 3. ParseUser signup
ParseUser user = new ParseUser();
user.setUsername("eortiz");
user.setPassword("123456");
user.setEmail("eortiz@nospam.com");
user.put("userType", "Author"); // add another field
// Call the asynchronous background method to sign up
user.signUpInBackground(new SignUpCallback() {
public void done(ParseException e) {
if (e == null) {
// Successful. Allow access to app.
} else {
// Failed....
}
}
});

El username y email deben ser nicos. Si un username o email ya est en uso, el


llamado de inicio de sesin fallar. Usted debe tener un mecanismo para notificar al
usuario si alguno de los campos falla, as como un proceso para intentar de nuevo.
Despus del inicio de sesin, los usuarios pueden iniciar sesin en su aplicacin,
como se muestra en el Listado 4:
Listado 4. Inicio de sesin ParseUser
ParseUser.logInInBackground("eortiz", "123456", new LogInCallback() {
public void done(ParseUser user, ParseException e) {
if (user != null) {
// Successful. Allow access to app.
} else {
// Failed
}
}
});

Usted pueda actualizar la informacin de usuario al llamar a ParseUser.save().


Observe, sin embargo, que solo el propietario de ParseUser puede modificar su
contenido; para todos los dems, los datos son de solo lectura.
Parse almacena el usuario actual que inici sesin. Usted puede consultar al usuario
actual llamando a ParseUser.currentUser(). El mtodo currentUser le permitir
rpidamente acceder a la informacin del usuario actual, de manera que usted solo
necesita solicitar credenciales si la sesin de usuario actual no est activo. El Listado
5 muestra cmo recuperar un usuario actual en Parse:

Analice servicios basados en la nube para aplicaciones


de Android

Pagina 5 de 17

developerWorks

ibm.com/developerWorks/ssa/

Listado 5. ParseUser getting the current user


ParseUser currentUser = ParseUser.getCurrentUser();
if (currentUser != null) {
// current user is valid
} else {
// current user not valid, ask for credentials
}

Restablecimiento de un usuario actual


Usted puede restablecer a un usuario actual en Parse llamando a
ParseUser.logOut(), como se muestra en el Listado 6:
Listado 6. ParseUser resetting current user (log out)
ParseUser.logOut(); // static method

ACLS de Parse
Una ACL es una lista de permisos de acceso (o controles) que son asociados
a un objeto de datos. La clase ParseACL le permite definir los permisos para un
determinado ParseObject. Con las ACLs, usted puede definir acceso pblico a
sus objetos de datos de aplicaciones y usted puede limitar el acceso a usuarios
especficos o grupos de usuarios (via papeles). El Listado 7 demouestra el uso de
las Parse ACLs:
Listado 7. Usando ParseACL para permisos de acceso
// Define a Parse user
ParseUser user = new ParseUser();
user.setUsername(username);
:
:
// Define a read/write ACL
ParseACL rwACL = new ParseACL();
rwACL.setReadAccess(user, true); // allow user to do reads
rwACL.setWriteAccess(user, true); // allow user to do writes
:
:
// Define a Parse object and its ACL
ParseObject gameObject = new ParseObject("Game");
gameObject.setACL(rwACL); // allow user do read/writes on gameObject
gameObject.saveInBackground(); // save the ACL'ed object to the cloud
:
:
// You can define a public ACL that gives public access to the object
ParseACL publicACL = new ParseACL();
publicACL.setPublicReadAccess(true);
publicACL.setPublicWriteAccess(true);
gameObject.setACL(publicACL); // allow public read/writes
gameObject.saveInBackground(); // save the ACL'ed object to the cloud

Usted tambin puede definir una ACL predeterminada para todos los objetos
creados nuevamente. En el Listado 8 yo he configurado la ACL predeterminada para
que sea pblica para lectura y escritura, conforme se define por publicACL en el
Listado 7.
Analice servicios basados en la nube para aplicaciones
de Android

Pagina 6 de 17

ibm.com/developerWorks/ssa/

developerWorks

Listado 8. Configuracin de la ACL predeterminada


// Set a default ACL for all newly created objects as public access
ParseACL.setDefaultACL(publicACL, true);

Aunque no se muestra aqu, tambin podramos usar la clase ParseRole para otorgar
permisos de acceso a grupos de usuarios.
Poseriormente, observaremos cmo los objetos de datos Parse son guardados y
recuperados de la nube Parse.

Objetos de datos Parse


Una vez que usted haya creado y poblado un ParseObject, usted puede guardarlo
en la nube Parse. El guardar objetos de datos en la nube Parse es de hecho una
de las cosas ms sencillas de hacer en Parse; la complejidad que est usualmente
asociada con la representacin de datos, ordenacin, comunicacin y transporte de
red, y as sucesivamente, est completamente ocultada por Parse. Usted necesitar
usar mtodos de ayudante para correlacionar su instancia de objeto de datos en un
ParseObject y de regreso, y usted necesitar decidir si desea asignar la operacin
de guardar de Parse en su propia hebra o usar el mtodo de guardar en segundo
plano.
Tenga cuidado de no bloquear la hebra del sistema!
Recupere eso en aplicaciones mviles, las operaciones largas como
computacin de red, archivo, o largos no deben hacerse en la hebra del
sistema principal. En vez de eso, ejectelas bajo una hebra de trabajador
separada. Bloquear la hebra del sistema afectara negativamente el nivel
de respuesta de la UI de la aplicacin, potencialmente provocando que su
aplicacin sea forzada a cerrar.

ParseObject proporciona dos tipos de mtodos de guardado: save() y


saveInBackground(). saveInBackground() es el mtodo de guardar recomendado

ya que ejecuta la operacin de guardar en su propia hebra de trabajador. Si


usted opta por escoger el mtodo sincrnico save() , est conciente de que es su
responsabilidad llamar a este mtodo en su propia hebra de trabajo para prevenir
que se bloquee a la UI.
El Listado 9 muestra el cdigo para guardar un objeto de datos Parse en segundo
plano:
Listado 9. Guarde ParseObject en segundo plano
// ParseObject
ParseObject pObject = new ParseObject("ExampleObject");
pObject.put("myNumber", number);
pObject.put("myString", name);
pObject.saveInBackground(); // asynchronous, no callback

Y el Listado 10 muestra el cdigo para guardar un objeto de datos Parse en segundo


plano con una devolucin de llamado:
Analice servicios basados en la nube para aplicaciones
de Android

Pagina 7 de 17

developerWorks

ibm.com/developerWorks/ssa/

Listado 10. Guarde en segundo plano con una devolucin de llamado


pObject.saveInBackground(new SaveCallback () {
@Override
public void done(ParseException ex) {
if (ex == null) {
isSaved = true;
} else {
// Failed
isSaved = false;
}
}
});

Las variaciones del mtdo save...() incluyen lo siguiente:


saveAllinBackground() guarda un ParseObject con o sin una devolucin de
llamado.
saveAll(List<ParseObject> objects) guarda una lista de ParseObjects.
saveAllinBackground(List<ParseObject> objects) guarda una lista de
ParseObjects en segundo plano.
saveEventually() le permite guardar un objeto de datos en el servidor en el
futuro; use este mtodo si la nube Parse no est actualmente disponible.
Una vez que un ParseObject ha sido guardado exitosamente en la Nube, se le
asigna un ID de Objeto nico nico. Este ID de Objeto es muy importante ya que
identifica de manera nica esa instancia de ParseObject . Usted usara el ID de
Objeto, por ejemplo, para determinar si un objeto fue guardado exitosamente en la
nube, para recuperar y renovar una instancia dada de objeto Parse, y para suprimir
un determinado ParseObject.

Recuparacin de objetos de datos de la nube


Esta seccin observa los mtodos para consultar y recuperar objetos de datos
almacenados en la nube Parse. Usted puede consultar un nico ParseObject por
object-ID, o usted puede consultar uno o ms de objetos Parse usando atributos.
Si usted ya tiene un ParseObject, usted puede renovar o sincronizar su contenido al
captar los ltimos valores del servidor. Observaremos todas estas funciones en los
siguientes fragmentos de cdigo.
Captando ParseObjects
Para captar un objeto de datos de la nube Parse, use el mtodo ParseObject
fetch() o fetchInBackground(), mostrado en el Listado 11:
Listado 11. Captacin (incondicional)
// ParseObject
ParseObject pObject = new ParseObject("ExampleObject");
:
:
// Fetch the parse object unconditionally
try {
pObject.fetch();
} catch (ParseException e) {

Analice servicios basados en la nube para aplicaciones


de Android

Pagina 8 de 17

ibm.com/developerWorks/ssa/

developerWorks

e.printStackTrace();
}
// Fetch the parse object unconditionally, with Callback
pObject.fetchInBackground(new GetCallback() {
@Override
public void done(ParseObject obj, ParseException ex) {
if (ex == null) {
// Success
} else {
// Failed
}
}
});

Usted tambin puede captar solo si necesita; por ejemplo, cuando capta un objeto
Parse que ha relacionado objetos Parse, como en el Listado 12:
Listado 12. Captando conforme se necesita
ParseObject po = new ParseObject("ExampleObject");
:
ParseObject po2 = po.getParseObject("key");
// Fetch only if needed
try {
po2.fetchIfNeeded();
} catch (ParseException e) {
e.printStackTrace();
}

Otra opcin es realizar una operacin de "captar si es necesario" en segundo plano


con una devolucin de llamado. Para esto, usted usara el mtodo de objeto Parse
fetchIfNeededInBackground(GetCallback callback).
En algunos casos, usted necesitar captar una coleccin de objetos Parse una vez,
incondicionalmente, o solo si se necesita. ParseObject proporciona un conjunto de
mtodos estadsticos; cada uno toma como entrada una lista de objetos Parse y
luego retorna una lista de objetos Parse:
fetchAll(List<ParseObject> objects)
fetchAllIfNeeded(List<ParseObject> objects)
fetchAllIfNeededInBackground(List<ParseObject> objects, FindCallback
callback)
fetchAllInBackground(List<ParseObject> objects, FindCallback callback)

Consultado objetos de datos en la nube


Ojal que ustes hasta ahora ya se haya dado cuenta de que la Parse API es super
completa pero espere, hay ms! Adems de captar objetos de datos, Parse
tambin le permite consultar objetos de datos usando object-ID o atributos. Paa
consultar un objeto de datos desde la nube Parse, use ParseQuery. Usted puede
usar ParseQuery tanto para consultas de datos bsicas como complejas, recibiendo
de regreso un objeto dado o una Lista de objetos que coinciden.
Analice servicios basados en la nube para aplicaciones
de Android

Pagina 9 de 17

developerWorks

ibm.com/developerWorks/ssa/

El Listado 13 muestra cmo recuperar un objeto especfico de Parse del servidor en


una hebra de segundo plano, dado un ID de objeto:
Listado 13. Uso de ParseQuery para recuperar un determinado ParseObject
String myID = "12345";
ParseQuery query = new ParseQuery("Players");
query.getInBackground(myID, new GetCallback() {
@Override
public void done(ParseObject object, ParseException e) {
if (object != null) {
// Get object
} else {
// Not found
}
}
});

Observe que query.getInBackground() no usa la memoria cach ParseQuery .


El Listado 14 muestra una consulta que recupera todos los datos de objetos de
clase: Players. (Sin restriccin proporcionada).
Listado 14. Usando ParseQuery para todos los ParseObjects de una clase dada
ParseQuery query = new ParseQuery("Players");
query.findInBackground(new FindCallback() {
@Override
public void done(List<ParseObject> players, ParseException e) {
if (players != null) {
// Get list of players
} else {
// No players
}
}
});

En el Listado 15 he usado una restriccin de consulta para recuperar uno o ms


objetos de coincidencia de Parse; en este caso Players activos:
Listado 15. Usando ParseQuery para recuperar ParseObjects coincidentes
ParseQuery query = new ParseQuery("Players");
query.whereEqualTo("status", "active");
query.findInBackground(new FindCallback() {
@Override
public void done(List<ParseObject> players, ParseException e) {
if (players != null) {
// Success - players contain active players
} else {
// Failed
}
}
});

tambin proporciona un mtodo para obtener el conteo de objetos de


coincidencia sin recuperar los mismos objetos, lo que es muy til. El Listando 16
muestra cmo obtener el conteo de participantes activos:
ParseQuery

Analice servicios basados en la nube para aplicaciones


de Android

Pagina 10 de 17

ibm.com/developerWorks/ssa/

developerWorks

Listado 16. Usando ParseQuery para contar ParseObjects coincidentes


ParseQuery query = new ParseQuery("Players");
query.whereEqualTo("status", "active"); //remove this line to count ALL
query.countInBackground(new CountCallback() {
@Override
public void done(int count, ParseException e) {
if (e == null) {
// Success, see count variable
} else {
// Failed
}
}
});

Mtodos y restricciones de ParseQuery


ParseQuery da soporte a ms de 20 mtodos de consulta-restriccin; aqu hay
algunos ejemplos:
whereMatches(String key, String regex) encuentra valores de cadena de
caracteres que coinciden con la expresin normal proporcionada.
whereStartsWith(String key, String prefix) encuentra valores de cadena
de caracteres que inician con una cadena de caracteres proporcionada.
whereContains(String key, String substring) encuentra valores que
contienen una cadena de caracteres proporcionada.
whereGreaterThan(String key, Object value) encuentra valores que son
mayores que el valor proporcionado.
whereWithinKilometers(String key, ParseGeoPoint point, double
maxDistance) encuentra objetos con valores de puntos cerca del punto dado y
dentro de la distancia mxima dada.
Los resultados de consulta pueden ser ordenados, como se muestra en el Listado
17. Para ordenar resultados de consulta de pedido, llame a uno de los mtodos
query orderBy...() , especificando el campo por el cual ordenar.
Listado 17. Ordering query results
query.orderByAscending("name");
query.orderByDescending("name");

Por ejemplo:

ParseQuery query = new ParseQuery("Players");


query.whereEqualTo("status", "active");
query.orderByAscending("lastName"); // By lastname ascending order
query.findInBackground(new FindCallback() {
@Override
public void done(List<ParseObject> players, ParseException e) {
if (players != null) {
// Success - players contain active players

Analice servicios basados en la nube para aplicaciones


de Android

Pagina 11 de 17

developerWorks

ibm.com/developerWorks/ssa/

} else {
// Failed
}
}
});

Otra cosa que se debe observar es que ParseQuery los resultados son puestos en
memoria cach. Usted puede configurar la poltica de consulta-memoria cach de
diversas maneras dependiendo de las necesidades de su aplicacin. L as siguientes
polticas de memoria cach cuentan actualmente con soporte:
IGNORE_CACHE: No usar la memoria cach; esta es la poltica de memoria cach
predeterminada.
CACHE_ONLY: Solo cargar de la memoria cach. Si no hay resultados en memoria
cach, habr una ParseException.
NETWORK_ONLY: Siempre ir a la red, pero guardar los resultados en la memoria
cach.
CACHE_ELSE_NETWORK: Dirigirse a la memoria cach primero. Si eso falla, cargar
de la red. Si no hay xito con la memoria cach o con la red, el resultado ser
una ParseException.
NETWORK_ELSE_CACHE: Dirigirse a la red primero. Si eso falla, cargar de la
memoria cach. Si no hay xito con la red o con la memoria cach, el resultado
ser una ParseException.
CACHE_THEN_NETWORK: Dirigirse a la memoria cach primero, posteriormente
cargar de la red. Observe que FindCallback ser llamado dos veces: primero
con los resultados en memoria cach, posteriormente con resultados de red.
Esta poltica solo puede ser usada asincrnicamente con findInBackground.
Configurar la poltica de memoria cach es sencillo. Hgalo antes de llamar al
mtodo find...() , como se muestra en el Listado 18:
Listado 18. Gestin de CachePolicy
ParseQuery query = new ParseQuery("Players");
query.setCachePolicy(ParseQuery.CachePolicy.NETWORK_ELSE_CACHE);
query.findInBackground(new FindCallback() {
@Override
public void done(List<ParseObject> players, ParseException e) {
if (e == null) {
// Success - players contain active players
} else {
// Failed
}
}
});

La clase ParseQuery proporciona todos los mtodos necesitados para consultar


objetos de datos que estn almacenados en la nube. Con ParseQuery, usted puede
especificar restricciones de consulta de todos los tipos, contar objetos de datos
Analice servicios basados en la nube para aplicaciones
de Android

Pagina 12 de 17

ibm.com/developerWorks/ssa/

developerWorks

coincidentes, establecer lmites, saltar objetos de datos, ordenar por, limpiar la


memoria cach, y mucho ms.

Remocin de objetos de datos


La remocin de un objeto de datos de la nube Parse tambin es muy sencillo.
Una vez que usted tenga la instancia de objeto, usted puede suprimir un
ParseObject existente de la nube al llamar al mtodo ParseObject delete() o
deleteInBackground(). Ambos se muestran en el Listado 19:
Listado 19. Remocin de un objeto Parse de la nube
parseObject.delete();
parseObject.deleteInBackground();

Como puede anticipar, delete() un llamado que bloquea, lo que significa que es
responsabilidad de usted asignar adecuadamente este llamado a su propia hebra
de trabajador. O usted puede dejar que Parse se encargue de las hebras usando
deleteInBackground() con o sin una devolucin de llamado.

Trabajo con archivos


Hasta este punto, hemos estado trabajando con objetos Parse y consultas Parse.
Tambin lo he introducido a los usuarios Parse, ACLs, y papeles. Concluir con una
demostracin de trabajo con funciones de leer, escribir y guardar archivos en Parse.
Recuerde que puede almacenar datos en crudo byte[] dentro de un ParseObject, que
est bien para una pequea cantidad de datos. Cuando almacene tems mayores
como imgenes o documentos, use Parse Files.
Los archivos en la nube Parse son representados usando ParseFile, que
proporciona mtodos para obtener el nombre de un archivo, su URL, y los datos del
mismo archivo, asumiendo que est disponible. Usted tambin puede descargar y
subir archivos y acceder a otros mtodos de ayudante.
Los datos de archivos son representados por byte[] . Observe que actualmente
un archivo dado no puede ser mayor de 10MB. Cuando nombra un archivo, la
biblioteca Parse se encarga de las colisiones potenciales de nombre. Proporcionar
una extensin de archivo ayuda a Parse a manejar el contenido de archivos.
El Listado 20 demuestra cmo guardar un archivo JPG:
Listado 20. Saving a ParseFile
// Save image file
Drawable drawable = ...;
Bitmap bitmap = (Bitmap)((BitmapDrawable) drawable).getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] data = stream.toByteArray();
ParseFile imageFile = new ParseFile("image.jpg", data);
imageFile.saveInBackground();

Analice servicios basados en la nube para aplicaciones


de Android

Pagina 13 de 17

developerWorks

ibm.com/developerWorks/ssa/

Las sentencias principales en el Listado 20 convierten al bitmap en byte[]. El byte[]


es posteriormente guardado usando un mtodo ParseFile saveInBackground() ,
similar a cmo ParseObject se guarda en el servidor.
Una vez que el archivo ha sido guardado en Parse, debe ser asociado con
(colocado en) un ParseOject. En otras palabras, los archivos Parse no son objetos
verdaderamente autnomos y para ser recuperados y usados posteriormente, deben
asociarse con un determinado ParseObject . Esta limitacin puede ser abordada en
un release futuro de Parse. El Listado 21 asocia el archivo de imagen con un objeto
Player Parse:
Listado 21. Asociacin de un ParseFile con un ParseObject
// Associate image with Parse object
ParseObject po = new ParseObject("Players");
po.put("name", "eortiz");
po.put("photo", imageFile);
po.saveInBackground();

Yo he asociado el archivo con el objeto de datos, luego guardado el objeto en el


servidor usando saveInBackgroud(), que discut previamente.
El Listado 22 muestra cmo recuperar un archivo que es asociado con un objeto de
datos:
Listado 22. Recuperacin de ParseFile
// Retrieving the file
ParseFile imageFile2 = (ParseFile)po.get("photo");
imageFile2.getDataInBackground(new GetDataCallback() {
public void done(byte[] data, ParseException e) {
if (data != null) {
// Success; data has the file
} else {
// Failed
}
}
});

Despus de recibir una referencia ParseFile de un objeto Parse, llam a


getDataInBackground() para recuperar ParseFile de los servidores. Observe que
us la devolucin de llamado GetDataCallback para recuperar los archivos files, en
oposicin a GetCallback, que es para recuperar objetos Parse con ParseQuery.

En conclusin
La Parse API es muy completa e incluye clases para acceder a servicios mviles
como notificacin push, uso de geo-datos, integracin con plataformas de medios
sociales y ms. En este artculo, he mostrado solo la superficie de lo que puede
hacer con Parse al introducir las Parse APIs para almacenamiento de nube de
datos y archivos. El saber cmo almacenar y manipular usuarios, objetos de datos,
Analice servicios basados en la nube para aplicaciones
de Android

Pagina 14 de 17

ibm.com/developerWorks/ssa/

developerWorks

archivos y ACLs de Parse en la nube Parse es una base buena para explorar ms
esta plataforma de nube para desarrollo mvil.
Reconocimientos
Muchas gracias a Athen O'Shea por su revisin de este artculo.

Analice servicios basados en la nube para aplicaciones


de Android

Pagina 15 de 17

developerWorks

ibm.com/developerWorks/ssa/

Recursos
Aprenda ms acerca de Parse Android SDK; tambin vea la Gua Rpida
de Parse para escoger una plataforma mvil, configurar una aplicacin, y
descargar e instalar su Parse SDK.
Vea una lista completa de las Parse Android APIs.
"Desarrolle aplicaciones Android con Eclipse (Frank Ableson, developerWorks,
Febrero del 2008): Obtenga ms prctica desarrollando aplicaciones Android
en el entorno de desarrollo de Eclipse, esta vez usando el plug-in de Android
Eclipse.
"Introduction to jQuery Mobile" (C. Enrique Ortiz, developerWorks, Mayo del
2012): Aprenda lo bsico de jQuery Mobile y cmo escribir una interfaz de
usuario funcional de aplicacin web mvil. Los ejemplos de trabajo lo guiarn
a travs de pginas, navegacin, barras de herramientas, visualizaciones de
lista, controles de forma y efectos de transicin en jQuery Mobile.
"Resuelva los desafos de integracin de su aplicacin mvil para muchos
dispositivos en mltiples plataformas" (Olivier Picciotto, developerWorks,
octubre de 2012): El desarrollo mvil y la computacin en nube son
prcticamente inseparables estos das, pero integrar las aplicaciones mviles
en la nube todava es un territorio nuevo. Aprenda cmo la plataforma de
aplicacin empresarial mvil (MEAP) resuelve algunos de los desafos de
integracin de "mvil hacia nube".
"DevOps for mobile development" (Michael Rowe, developerWorks, Julio del
2012): Las compaas de todo el mundo desean explotar el mercado mvil al
proporcionar a los clientes y usuarios aplicaciones que facilitan la computacin
mvil. Este artculo reflexiona acerca de los problemas tcnicos y de negocios
con la integracin de desarrollo y operaciones para las plataformas mviles en
el lugar de trabajo.
Siga a developerWorks en Twitter.
Vea las demos on demand de developerWorks que van desde demostraciones
sobre instalacin y configuracin de productos para principiantes, hasta
funcionalidades avanzadas pera desarrolladores experimentados.
Participe de la comunidad developerWorks. Conctese con otros usuarios de
developerWorks mientras explora los blogs dirigidos a desarrolladores, foros,
grupos y wikis.

Analice servicios basados en la nube para aplicaciones


de Android

Pagina 16 de 17

ibm.com/developerWorks/ssa/

developerWorks

Sobre el autor
C. Enrique Ortiz
C. Enrique Ortiz es un tecnlogo y autor con gran experiencia. Un
ex ingeniero en software de transbordadores espaciales que decidi
focalizarse en tecnologas mviles ms que en trabajar en cohetes
peligrosos, asesora a desarrolladores, empresas que recin se inician
e inversores sobre cosas mviles: tecnologa, estrategia, productos y
lanzamientos al mercado.
Copyright IBM Corporation 2013
(www.ibm.com/legal/copytrade.shtml)
Marcas
(www.ibm.com/developerworks/ssa/ibm/trademarks/)

Analice servicios basados en la nube para aplicaciones


de Android

Pagina 17 de 17

Você também pode gostar