¿Es posible obtener acceso de sólo lectura a una base de datos sqlite en un apk?

Posible duplicado:
Cómo poner base de datos existente en el archivo .apk?

¿Es posible obtener acceso de sólo lectura a una base de datos sqlite ubicada con un apk? No quiero duplicar la base de datos si es posible acceder a ella para fines de sólo lectura desde el apk.

Acabo de empezar a desarrollar para Android, y me sorprendió descubrir que un paquete de una base de datos estática no es fácil de hacer . Así que hice lo único razonable: crear una biblioteca que hace precisamente eso.

Android-staticdb es una biblioteca de Android que permite el acceso de sólo lectura a las bases de datos SQLite contenidas en el archivo .apk una aplicación. Esto es ideal para aplicaciones que necesitan enviarse con una gran cantidad de datos estáticos (por ejemplo, un lector de Wikipedia sin conexión).

Funciona registrando una nueva capa de "sistema de archivos virtual" con la biblioteca SQLite del código C nativo, que es capaz de interceptar las llamadas al sistema de archivos realizadas por SQLite. Debido a que sólo hay una copia de la biblioteca SQLite por proceso de VM, de hecho terminamos interceptando cualquier llamada SQLite realizada por cualquier aplicación en el mismo proceso que nosotros.

En funcionamiento normal, nuestra capa VFS simplemente proxies todas las llamadas al VFS "predeterminado", que sólo usa open () y read () para acceder a los archivos regulares de la base de datos. Pero cuando se encuentra un nombre de archivo especial que coincide con el patrón de *.apk!filename , nuestro control de captura de VFS. Utilizando zlib y minizip, abre el archivo .apk y busca dentro del archivo de base de datos; A continuación, leer los trozos de este archivo para satisfacer cualquier petición read() de SQLite.

Al hacer esto de esta manera, las aplicaciones pueden seguir utilizando las API estándar de la base de datos de Android.

Ejemplo de uso:

 import android.database.sqlite.SQLiteDatabase; import kiwidrew.staticdb.StaticDatabase; public class BlahBlah extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SQLiteDatabase db = StaticDatabase.openDatabase(this, "assets/foobar.db"); // Do normal database stuff with 'db'... } } 

Recibe un objeto estándar de SQLiteDatabase, con la única restricción de que no admite la escritura. (¡Obviamente!)

Tenga en cuenta que esto fallará a menos que la base de datos esté almacenada en su .apk sin compresión. Agregue la base de datos SQLite usando el comando aapt -0 o modifique su build.xml para pasar el <nocompress extension="db" /> a la etiqueta <aapt>

Nota:

Literalmente acabo de escribir esto, y sólo he hecho pruebas muy básicas hasta ahora. Informes de errores se agradecería.

Como se menciona en esta respuesta Cargue archivos de más de 1M de la carpeta de activos

Si el elemento no está comprimido, el sistema puede asignar mapas de memoria y utilizar el sistema de paginación de memoria virtual de Linux para extraer o descartar fragmentos de 4K según corresponda.

Si eso es cierto, se podría almacenar la base de datos sin comprimir a APK (utilizando algunas de las extensiones como mp3 para mantener el archivo sin copiar) y leerlo directamente desde APK. Eso es sólo mis especulaciones, no estoy realmente seguro sobre la aplicación sin embargo.

Para Android 2.3 y versiones más recientes, puede utilizar Native Access mediante NDK http://groups.google.com/group/android-ndk/browse_thread/thread/30b9f5abf48347a0/ef62db9a18646b1d .

No, el apk debe tener una interfaz para que pueda extraer datos, que pueden exponerse con un servicio de Android.

Según mi conocimiento, Android es una distribución de Linux donde cada .apk está instalado como / por una cuenta de usuario independiente, ninguna de las cuales es root. Por lo tanto, los espacios de aplicación se comparten de forma efectiva.

  • Android SQLite Excepción: no se puede cerrar debido a declaraciones sin finalizar
  • EditText afterTextChanged no funciona
  • Acceso a la aplicación de Android Lite para Android
  • Necesita ayuda para leer de la base de datos SQLite para Android
  • Android - Contenido Valores sobre la escritura de filas existentes
  • Aplicación detenida en Android / SQLITE ERROR /
  • Caracteres especiales de Android Sqlite
  • Android: cómo consultar SQLiteDatabase con args de selección de no-cadena?
  • Enfoque para rellenar la vista de lista expandible con la base de datos SQlite local
  • Android SQLite Eliminar problema de fila
  • Obtener base de datos SQLite desde la aplicación de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.