2012-10-04 18 views
11

Quiero usar una base de datos "precargada" en mi aplicación. Hay toneladas de preguntas sobre esto y la mayoría apuntan a este artículo de blog here o similar.Obtener el directorio de bases de datos para mi aplicación programáticamente

Hasta ahora todo bien. Sólo quiero saber si hay una mejor manera de obtener el directorio de bases de datos por defecto por lo que no tiene que usar algo como esto:

private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/"; 

decir, tal vez que se cambia en el futuro o tal vez un dispositivo o rom podría ubicarlo en otra parte ... entonces, ¿hay alguna manera de obtener este camino programáticamente?

En Contexto existe un método para getDatabasePath (nombre), pero hay que darle un nombre db existente y bien ... que aún no existe, quiero seguir allí: P

+0

http://stackoverflow.com/questions/9109438/how-to-use-an-existing-database-with-an-android- application/9109728 # 9109728 –

Respuesta

6

Crear un vacío DB, obtener la ruta con getDatabasePath(), a continuación, sobrescribir con su propio.

+1

Ya estaba haciendo esto ... pero suena como un truco: D Pero bueno ... seguro que funciona. –

+4

Bueno, dado que no hay una API oficial para importar un archivo DB ya hecho, poner su propio archivo allí también es un truco. Al menos te estás asegurando de ponerlo en el lugar correcto. –

+0

¿Necesito permiso de escritura para eso? – Simon

6

Usted puede usar el Método getFilesDir() o getDatabasePath en una clase de actividad para obtener esta carpeta.
Más información here

10

utilicé ...

String destPath = getFilesDir().getPath(); 
destPath = destPath.substring(0, destPath.lastIndexOf("/")) + "/databases"; 
+1

¿Qué sucede si la carpeta cambia en una versión futura? – pablisco

7

Utilizado por SQLiteAssetHelper:

String path = mContext.getDatabasePath(mName).getPath(); 

En este momento, no existe la base de datos. Creo que la cadena simplemente toma la ruta interna y agrega los modificadores apropiados. De hecho, esto parece funcionar muy bien:

context.getDatabasePath("a").getParentFile() 

Básicamente, no es necesario tener una base de datos real creado, solo pregunte por uno.

+2

Es posible que el directorio de la base de datos no exista, por lo que antes de escribir/copiar cualquier contenido en context.getDatabasePath ("a") asegúrese de verificar que context.getDatabasePath ("a"). GetParentFile() exista y, de no ser así, cree el directorio. – nibarius

1

Puede utilizar el método getDatabasePath en su Clase auxiliar:

public class MyDatabase extends SQLiteAssetHelper { 

    private static final String DATABASE_NAME = "wl.db"; 
    private static final int DATABASE_VERSION = 1; 
    public String databasePath = "";  

    public MyDatabase(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 

     // you can use an alternate constructor to specify a database location 
     // (such as a folder on the sd card) 
     // you must ensure that this folder is available and you have permission 
     // to write to it 
     // super(context, DATABASE_NAME, context.getExternalFilesDir(null).getAbsolutePath(), null, DATABASE_VERSION); 

     databasePath = context.getDatabasePath("wl.db").getPath(); 
    } 
Cuestiones relacionadas