2011-07-21 26 views
5

Estoy tratando de crear una base de datos en mi tarjeta SD. Siempre que llamo SQLiteDatabase.openOrCreateDatabase me sale el error:Android abrir o crear base de datos

07-21 13:33:17.587: ERROR/AndroidRuntime(5541): Caused by: android.database.sqlite.SQLiteException: unable to open database file

¿Alguien sabe qué puede estar causando esto? Aquí está el código que tengo en el método open() de mi clase de base de datos:

File sdcard = Environment.getExternalStorageDirectory(); 

String dbfile = sdcard.getAbsolutePath() + File.separator+ "external_sd" + File.separator + Schema.DATABASE_NAME ; 

db = SQLiteDatabase.openOrCreateDatabase(dbfile, null); 
+1

Como nota al margen, ¿por qué intentas escribir la base de datos en la tarjeta sd, en lugar de/data/data? –

+0

Quiero poder ayudar a los usuarios si hay algún error en los datos. De hecho, estoy extrayendo los datos de una base de datos de servidor sql, así que quiero poder detectar y manipular cualquier dato inesperado. Supongo que podría crear algunas clases para importar y exportar la base de datos del almacenamiento privado. – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

Respuesta

8

Un posible fallo en esto podría ser que no ha establecido los permisos adecuados

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

datos Sin embargo almacenan en una tarjeta SD se considera insegura. Porque cada aplicación que tenga permisos para almacenar datos en el almacenamiento sd podría acceder a la base de datos.

Editar: Otro posible problema es que el almacenamiento externo puede no estar disponible. Debe asegurarse de que su almacenamiento externo sea actualmente editable. Un método sería determinar el estado a través del getExternalStorageState (ver referencia here).

getExternalStorageState() returns MEDIA_SHARED if the media is present not mounted, and shared via USB mass storage. 

Reference. También hay una publicación stackoverflow al verificar el estado aquí: Writing Text File to SD Card fails

+0

Ya tengo ese conjunto de permisos en mi archivo de manifiesto. Esto es para una aplicación que no es de mercado, por lo que no me preocupan otras aplicaciones que intenten acceder a mis datos. – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

+0

Environment.getExternalStorageState() == shared – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

+0

Eso es exactamente su problema @ == shared – fyr

Cuestiones relacionadas