¿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.
- ¿Cómo actualizar la tabla en sqlite?
- Ejemplo de creación de un sqlite db en memoria en Java (Android)?
- ¿Cómo acceder a la base de datos sqlite existente en Android Emulator?
- Excepción Sqlite, error de sintaxis
- SQLite SUM y LIMIT no parecen funcionar juntos
- Obtener boolean de la base de datos utilizando Android y SQLite
- ¿Qué pasa con multithreading en Android SQLite?
- ¿Es Sqlite Database thread de instancia seguro
- Eliminación automática de objetos anidados en ORMLite
- Almacenamiento de datos de Android, Cuándo utilizar SqlLite y cuándo usar JSON, alternativas de Linq
- Cómo diferenciar dos tablas
- ¿Cómo puedo reiniciar la ID de incremento automático desde 1 en una base de datos SQLite de Android
- Sqlite - en rebaja
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.
- Crashing debido a Integer.parseInt
- Cómo encontrar la lista de View (s) que tiene una etiqueta específica (atributo)