2009-06-28 12 views
32

Ya descubrí que no hay forma de agrupar archivos en .apk y tenerlos en/sdcard, la mejor opción hasta ahora es descargar los archivos de gran tamaño en la primera ejecución. Encontré un tutorial que decía cómo agrupar un sqlite db con el apk y luego copiarlo para que se pueda acceder con SQLiteDatabase (duplicando así el espacio necesario y sin usar/sdcard).¿Puedo descargar un db SQLite en/sdcard y acceder desde mi aplicación de Android?

http://developer.android.com/guide/topics/data/data-storage.html#db dice que todas las bases de datos DEBEN estar en/data/data/package_name/databases.

¿Eso es realmente así? ¿Hay alguna manera de engañar al framework para que abra una base de datos que se coloca en la partición/sdcard? ¿Hay alguna forma de utilizar otro envoltorio/marco java SQLite para acceder a dichas bases de datos?

Si la respuesta a lo anterior es 'No', ¿qué otras opciones tengo? Mis datos están muy bien representados en un modelo relacional, pero es demasiado grande, además, quiero poder actualizarlo sin la necesidad de reinstalar/actualizar toda la aplicación.

+1

Usted ha mencionado "Me encontré con un tutorial diciendo cómo empaquetar una db sqlite con el apk y luego copiarlo ..". ¿Tiene un puntero a este recurso? – Ichorus

+1

@Ichorus - Creo que esto es a lo que se puede estar refiriendo - http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ –

Respuesta

44

Claro que puedes. Los documentos son un poco conflictivos sobre esto ya que también dicen que no se imponen limitaciones. Creo que deberían decir que las rutas relativas son a la ubicación anterior y dbs allí SON privadas. Aquí está el código que quiere:

File dbfile = new File("/sdcard/mydb.sqlite"); 
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null); 
System.out.println("Its open? " + db.isOpen()); 
+2

Entonces, ¿podemos acceder a esa base de datos? archivo de todas las actividades en la aplicación? ¡No pude hacerlo convencionalmente! –

+1

Gracias Adam. Y no olvides agregar este permiso: en tu AndroidManifest.xml –

+0

@Ashik: no veo por qué puedes hacerlo ' t acceder a ella en sus otras actividades. Tenemos muchas opciones: transfiera el objeto db SQLiteDatabase abierto a su actividad requerida o almacene su objeto db en una referencia estática. Eso debería cubrirlo. –

1

Sólo una idea:

  • usted puede poner su database.db en la carpeta de activos.

  • si el archivo es más grande que database.db 2Mb el sistema no es capaz de comprimir, por lo que necesita otras opciones de una

  • se puede cambiar el nombre de database.db por ejemplo database.jit o database.mp3 - que no están comprimidos, que en la primera ejecución puede cambiarle el nombre a database.db

7

Prueba esto:

String dir = Environment.getExternalStorageDirectory().getPath() 
File dbfile = new File(dir+"/mydb.sqlite"); 
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null); 
System.out.println("Its open? " + db.isOpen()); 
1

comparto siguiente código. Declara opcionesMenu Vector<String>

Vector <String> opcionesMenu = new Vector<String>(); 
// the database is SDCard. I saw the code to Blackberry (net.rim) 
String rutaDB = "/storage/extSdCard/Android/databases/Offshore.db"; 


    SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(rutaDB, null); 

    Cursor cursor = db.rawQuery("SELECT Codigo, Nombre FROM Ruta ORDER BY Codigo, Nombre", null); 

    if (cursor.moveToFirst()) 
    { 
     do 
     { 
      opcionesMenu.add(cursor.getString(0) + " - " + cursor.getString(1)); 
     } while(cursor.moveToNext()); 
    } 

    db.close(); 
Cuestiones relacionadas