Mejor manera de analizar la Biblia en Android

Estoy creando una aplicación para Android que necesita acceder a la Biblia. Quiero que esté fuera de línea, así que prefiero no usar una de las API de Internet. Después de leer este post, decidí almacenar el texto localmente como XML, como este

<bible> <bn="Genesis"> <cn="1"> <vn="1">In the beginning, God created the heavens and the earth.</v> 

Mi problema es que el archivo tiene casi 34.000 líneas de largo (4.4 MB) y se tarda mucho tiempo (unos minutos) para analizar todo el texto.

Ahora mismo estoy usando el XmlPullParser, como este

 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xpp = factory.newPullParser(); InputStream iStream = getResources().openRawResource(R.raw.bible); BufferedReader reader = new BufferedReader(new InputStreamReader(iStream)); xpp.setInput(reader); int eventType = xpp.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { // do something here eventType = xpp.next(); } 

¿Hay una mejor manera de almacenar y / o acceder a la Biblia localmente en Android?

He considerado almacenarla como múltiples archivos XML para analizarlo más rápido (un archivo separado para cada libro), pero preferiría no hacerlo si es posible.

Estoy abierto a cualquier sugerencia, incluyendo almacenar el texto como algo que no sea XML.

Gracias

3 Solutions collect form web for “Mejor manera de analizar la Biblia en Android”

Yo sólo usar SQLite como un "lugar de partida" – es decir, ¿por qué no ? (Bueno, realmente, una biblioteca existente / lector de libros / esquema de archivo bien establecido sería aún mejor, pero salvo que 🙂

SQLite tiene un acceso "en disco" muy eficiente, por ejemplo, no necesita analizar la memoria ni leer un archivo entero y soporta una búsqueda eficiente sobre índices (por ejemplo, buscar versos específicos o capítulos 2 a 12 en Éxodo). Esperaría que la base de datos SQLite y el archivo XML original tuvieran un tamaño de archivo comparable (suponiendo que el XML esté codificado en UTF-8).

A continuación, haga un programa / función para "cargar" el XML en el esquema apropiado en la base de datos SQLite – esto se puede hacer antes de tiempo (por ejemplo, en un PC y luego distribuir los archivos de base de datos SQLite pre-poblate) o la primera vez dicho XML Se carga en el cliente. Esto puede ser efectivamente el mismo código de lectura como lo es ahora .. sólo reemplazar "hacer algo" con "base de datos de actualización".

Yo evitaría un enfoque de división de archivos a menos que haya una razón particularmente buena para ello – que hará que sea más rápido encontrar un capítulo / verso específico, pero en realidad no "resolver el problema". Puesto que está usando un lector secuencial y no un DOM completo no necesariamente resultará en menos memoria – limitará simplemente la basura "leyó sobre" (y después descartado) mientras que buscaba. Pero entonces, ¿por qué no SQLite?

– En primer lugar Analizar el XML utilizando SAX, DOM, or Pull Parser , o puede probar algunas impresionantes bibliotecas como JAXP and JAXB or the infamous Castor .

En segundo lugar usted puede almacenar la Biblia localmente en la SQLite , como SQLite es simplemente un solo archivo SIN cualquier servidor , funciona bastante más rápido. Puede ser tan pequeño como 250K de tamaño.

/////////////////// Parte editada ///////////////////////////// //

Siempre es mejor mantener el trabajo de la interfaz de usuario en el hilo de interfaz de usuario, y el trabajo no-UI en el hilo no UI , pero que se convirtió en una ley con la llegada de la versión HONEYCOMB de Android.

Así que puede utilizar el Thread along with Handler , o elegir utilizar la opción más fácil proporcionada por Android conocido como PainLess Threading , su AsyncTask

– El uso de lo anterior mantendrá su UI sensible mientras hace el trabajo pesado del procesador en el fondo.

Mi consejo sería utilizar algo más que XML. Tenga en cuenta que no tengo nada contra XML en general; Sólo quiero que quede claro, ya que hay bastantes personas por ahí que se sienten XML no es bueno para nada en absoluto .

Estas son algunas de las consecuencias previstas del uso de XML en este caso:

Tiempos de búsqueda

Hacer saltar a posiciones específicas en su texto siempre es caro. XML le ofrecería dos maneras de hacerlo:

  1. Lea el documento completo de una manera que fluye hasta que usted golpeó el fragmento que usted buscaba. Muy lento.
  2. Lea todo el documento en una estructura de datos en la memoria, lo que le permitiría crear un índice de memoria desde algún tipo de identificador de ubicación al fragmento de texto real. Muy caro en términos de consumo de memoria.

Compacidad

Convertir toda la Biblia en un archivo XML lo haría ENORME . Por supuesto hay soluciones como Fast Infoset y Efficient XML (ambas codificaciones binarias de Infoset , el modelo de datos detrás de XML). Eso ayudaría un poco, pero quizás no mucho. Gzip probablemente reduciría a aprox. 1/3 del tamaño original, que otra vez ayudaría, pero todavía sería grande.

¿Qué hacer en su lugar?

Mi consejo sería considerar una codificación binaria de su texto bíblico; Uno que está optimizado para búsquedas rápidas. Al igual que, tener un índice dentro del archivo, asignar la ubicación (un verso) al desplazamiento donde empieza ese fragmento de texto real. Y si lo haces correctamente, incluso hay la ventaja de tener algo que es mucho más compacto que XML.

¿Más fuerte?

Suena mucho más difícil, pero en realidad, puede que no. También podría considerar mirar Preon , ya que Preon también se ha utilizado en Android, y le permite declarar de manera declarativa una estructura de datos en memoria en su representación binaria codificada. El propio marco determinará si hay una oportunidad de cargar datos perezosamente, desde el archivo de entrada.

  • No se puede resolver el símbolo HttpEntity, HttpResponse
  • Quiero analizar Google Map API para el geocódigo inverso en Android
  • XmlPullParser getAttributeValue devuelve null
  • ¿Cómo enviar la solicitud SOAP y analizar la respuesta SOAP en formato XML en Android?
  • Android ICS SOAP método no funciona?
  • Adview error de análisis de XML sin consolidar prefijo Android
  • XmlPullParserException sólo en ICS
  • Excepción android.view.WindowLeaked
  • Si cambio una biblioteca externa: AndroidManifest, no puedo analizar el archivo
  • La forma más fácil de escribir y leer un XML
  • android - string.xml error de análisis
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.