2010-01-07 14 views
8

Hay un servicio web que proporciona algunos datos que mi aplicación utiliza. Esta información es bastante grande y solo cambia MUY infrecuentemente, así que pensé que sería bueno si la aplicación pudiera almacenarla en la tarjeta SD y solo actualizarla si es necesario.Recomendaciones para datos persistentes en Android?

Actualmente estoy tomando los datos (un archivo XML) y analizándolos en un árbol de objetos usando SAX. Este proceso toma (como máximo) 2-3 segundos sobre mi WIFI. Sin embargo, la serialización de los objetos resultantes a la tarjeta SD tarda significativamente más (un minuto o más) y la deserialización aún lleva más tiempo que la simple descarga/análisis en primer lugar.

¿Alguien tiene alguna recomendación para mejorar esto o ideas alternativas para conservar estos datos (aparte de simplemente guardar el archivo XML y volver a realizar el repaso cada vez)?

ACTUALIZACIÓN: Esto es más que una colección trivial de registros. El objeto-gráfico es realmente ridículamente complejo y almacenarlo en una base de datos resultaría en docenas de tablas con un solo registro en cada una.

Respuesta

10

serialización de Android es notoriamente lento. Sugiero cambiar a usar XML o JSON (o lo que sea) y escribir el archivo de esa manera. Como ya tiene un analizador XML, puede tener más sentido simplemente almacenar en caché el archivo XML original que descargó y volver a analizarlo según sea necesario.

He cambiado de Serializable a almacenamiento de archivos JSON en una aplicación anterior y el aumento de velocidad fue increíble, al menos un orden de magnitud.

(Puedo estar malinterpretando su pregunta - Supongo que está utilizando Serializable para escribir en el disco. Si está reproduciendo el XML, entonces no estoy seguro de por qué es mucho más lento en la tarjeta SD. Estoy de acuerdo en que la base de datos SQLite tiene más sentido, pero como ya ha indicado, no se ajusta a las necesidades de su aplicación)

+0

Estaba considerando seriamente almacenar el archivo XML directamente desde el servidor (y probablemente lo haga) ... parecía deserializar objetos cada vez que los datos "deberían" ser más rápidos que reparsing un archivo XML. –

+0

La serialización de objetos funciona porque es muy genérica y el código genérico puede ejecutarse muy lentamente. Además, el almacenamiento es mucho más grande; Creo que reduje el tamaño de los archivos de más de 10 kilobytes con serialización a menos de un kilobyte (eso sí cuenta el gzip de mi JSON). –

-2

¿Por qué no utiliza la base de datos? Ver Android Data Storage Guide

+0

Una base de datos simplemente no tiene sentido para esta aplicación ... Me gustaría, pero es simplemente la tecnología incorrecta. –

+0

eso es lo que dijeron sobre la web basada en bases de datos hace 10 años –

+0

Gracias por la condescendencia ... es útil. –

0

Acabo de escribir una aplicación de Android para la última semana que básicamente hace esto. Consigue un archivo XML (grande) en línea y luego muestra parte de los datos en varias vistas.

Lo hacemos obteniendo y analizando el XML usando SAX, y (al analizar) escribiéndolo todo en una base de datos SQLite. Y luego solo consultamos la base de datos cada vez que necesitamos mostrar alguna vista del conjunto de datos.

Funciona como un amuleto, y es lo suficientemente rápido para mostrar una gran cantidad de datos en una superposición de mapa de google, donde estamos consultando la base de datos en cada llamada al método de sorteo de nuestra superposición de mapa.

Así que definitivamente sugeriría ir por un SQLite database, si los datos en el documento XML se representan fácilmente en una base de datos.

3

Además, a menos que sus datos sean al menos 100s de Kb, sugiero que solo guarde en su almacenamiento de datos privados en lugar de en la tarjeta SD. Tenga en cuenta que no puede confiar en que la tarjeta SD esté disponible.

0

Si el servicio web puede darle solo un número específico de resultados (algo así como: requestData entre el índice 1 y 10 o darme los primeros 25 resultados) trate de usar eso (ponga un simple botón "Cargar más resultados" o implemente un mecanismo de auto-carga). Si el servicio web no proporciona esta característica, intente guardar su xml en la tarjeta SD y cuando necesite los datos intente analizar solo una cantidad específica de resultados. ¡Espero que esto ayude!

Cuestiones relacionadas