En mi aplicación, utilizo ...SQLiteOpenHelper problema con nombre completo de la ruta BD
myFilesDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/Android/data/" + packageName + "/files");
myFilesDir.mkdirs();
Esto está muy bien y la trayectoria resultante es ...
/mnt/sdcard/Android/data/com.mycompany.myApp/files
Necesito un SQLite DB que quiero almacenar en la tarjeta SD de forma extiendo SQLiteOpenHelper de la siguiente manera ...
public class myDbHelper extends SQLiteOpenHelper {
public myDbHelper(Context context, String name, CursorFactory factory, int version) {
// NOTE I prefix the full path of my files directory to 'name'
super(context, myFilesDir + "/" + name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// Create tables and populate with default data...
}
}
hasta aquí todo bien - la primera vez que llamo getReadableDatabase()
o getWriteableDatabase()
el DB vacío se crea en la tarjeta SD y onCreate()
lo rellena.
Así que aquí está el problema: la aplicación está en pruebas beta con tal vez 5 o 6 personas y, como yo, están ejecutando Android v2.2 y todo funciona bien. Tengo un probador, sin embargo, v2.1 corriendo y cuando myDbHelper
trata de crear la base de datos en el primer uso, se bloquea con el siguiente ...
E/AndroidRuntime(3941): Caused by: java.lang.IllegalArgumentException: File /nand/Android/data/com.mycompany.myApp/files/myApp-DB.db3 contains a path separator
E/AndroidRuntime(3941): at android.app.ApplicationContext.makeFilename(ApplicationContext.java:1445)
E/AndroidRuntime(3941): at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:473)
E/AndroidRuntime(3941): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193)
E/AndroidRuntime(3941): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
E/AndroidRuntime(3941): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158)
El camino para el directorio de archivos es una extraña ("/nand ") ya que es la memoria interna aunque no es la memoria interna del teléfono, pero es la ruta devuelta por getExternalStorageDirectory()
para este dispositivo.
puedo ver tres respuestas posibles ...
- Aunque aceptable en v2.2, que especifica una ruta de acceso completa para el nombre de base de datos, no se recomienda y se producirá un error en las versiones anteriores
- rutas completas son aceptables para el almacenamiento de tarjetas SD pero el camino "/ ny" se interpreta como rutas relativas 'interno' y sólo son aceptables en este caso
- otra cosa, que me falta por completo
Si aplica cualquiera o todas las opciones anteriores, agradecería que alguien pudiera ayudarme con la forma en que debería abordar esto.
Gracias.
¿No fue esto antes? Parece que el anterior fue eliminado. – Klaus
@Klaus: Sí, me preguntó ella, pero después de 14 horas que tenía sólo unos 10 puntos de vista y no un solo comentario, así que un poco editado y 'golpeado' por volver a colocar después de que he eliminado el antiguo. – Squonk