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

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.

  • Cadena de decodificación codificada en formato utf-8 en android
  • Análisis local de xml android con drawable
  • Parsing Soap Uso del servicio de Retrofit Estoy frente a una excepción como este (es decir) modelo de cuerpo desajustado en el modelo de sobre de clase en la respuesta
  • Android cómo identificar audio / video de xml?
  • ¿Cómo puedo acelerar el análisis XML de Android?
  • Adview error de análisis de XML sin consolidar prefijo Android
  • No se detectaron restricciones de gramática (DTD o esquema XML) para el documento (Android)
  • Cómo evitar la inyección XML como XML Bomba y ataque XXE
  • ¿Cómo puede convertir el archivo XML local a org.ksoap2.serialization.SoapObject?
  • ¿Cómo enviar la solicitud SOAP y analizar la respuesta SOAP en formato XML en Android?
  • Analizando espermas inválidos con XmlPullParsers de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.