Android SQLiteOpenHelper no puede abrir el archivo de base de datos
Ya sé que el tema ya fue discutido antes. Pero no puedo encontrar la solución a mi problema así que voy a preguntarlo una vez más. Tengo problema que crea la base de datos. He copiado la implementación de SQLiteOpenHelper:
public class DBCreator extends SQLiteOpenHelper { private static final String DATABASE_NAME = "servision.db"; private static final int DATABASE_VERSION = 1; private static final String INFO_TABLE ="create table INFO(key text,value text);"; public static final String GATEWAYS_TABLE = "GATEWAYS"; // Table name public static final String TABLE = "events"; // Columns public static final String TIME = "time"; public static final String TITLE = "title"; public DBCreator(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { try { String gatewaytablescript ="create table" +GATEWAYS_TABLE+"(" + "id int primary key, " + "host text not null," + "port int not null," + "username text," + "password text,"+ "useproxy int," + "proxyHost text," + "proxyPort port," + "desc text," + "secondaryip text," + "secondaryport int," + "timezone int," + "encryption int," + "customkey text" + ");"; Log.d("DBCreator", "Creating " + GATEWAYS_TABLE + "table"); db.execSQL(gatewaytablescript); String infotablescript ="create table " + INFO_TABLE + "(key text,value text);"; Log.d("DBCreator", "Creating " + INFO_TABLE + "table"); db.execSQL(infotablescript); } catch(SQLException ex) { Log.d("DBCreator", "onCreate exception " +ex.getMessage()); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.d("EventsData", "onUpgrade"); if (oldVersion >= newVersion) return; } }
Y lo creo a partir del método onCreate de la actividad principal como esto.
- SQLiteOpenHelper onCreate no crea base de datos - o se está sobrescribiendo inmediatamente
- ¿Una base de datos SQLite de Android persiste después de apagar el dispositivo?
- Mantener los datos SQLite después de la actualización
- SQLite en Android Cómo actualizar una fila específica
- SQLite de Android usando db.query () para JOIN en lugar de rawquery ()
DBCreator db =new DBCreator(this); db.getReadableDatabase();
En logcat recibo la siguiente información:
06-01 17:31:15.523: INFO/global(2470): Default buffer size used in BufferedInputStream constructor. It would be better to be explicit if an 8k buffer is required. 06-01 17:31:15.652: INFO/Database(4160): sqlite returned: error code = 14, msg = cannot open file at source line 25467 06-01 17:31:15.652: ERROR/Database(4160): sqlite3_open_v2("/data/data/com.servision.svclient/databases/servision.db", &handle, 6, NULL) failed 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): Couldn't open servision.db for writing (will try read-only): 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): android.database.sqlite.SQLiteException: unable to open database file 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1921) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:883) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:960) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:953) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:602) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at com.servision.svclient.Main.onCreate(Main.java:52) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.os.Handler.dispatchMessage(Handler.java:99) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.os.Looper.loop(Looper.java:123) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at android.app.ActivityThread.main(ActivityThread.java:4627) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at java.lang.reflect.Method.invokeNative(Native Method) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at java.lang.reflect.Method.invoke(Method.java:521) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): at dalvik.system.NativeStart.main(Native Method) 06-01 17:31:15.738: INFO/Database(4160): sqlite returned: error code = 14, msg = cannot open file at source line 25467 06-01 17:31:15.738: ERROR/Database(4160): sqlite3_open_v2("/data/data/com.servision.svclient/databases/servision.db", &handle, 1, NULL) failed
OnCreate de DBCreator nunca se llama. Estoy ejecutando el programa en Galaxy S en modo de depuración de Eclipse. ¿Estoy perdiendo algunos permisos? Puede ser el contexto no es bueno o algo?
- Android - ¿Cuándo insertaOrThrow () lanzar una excepción?
- Cómo utilizar Spatialite con Xamarin en Android
- Cómo encontrar el valor máximo de la columna en la base de datos sqlite
- Código de error SQLite de Android 21
- DB de SQLite accedido desde múltiples subprocesos
- SQLite por qué copiamos db en carpeta de activos
- ¿Cómo puedo copia de seguridad de archivos sqlite en tarjeta SD mediante programación?
- No se puede eliminar la columna de la tabla sqlite
En relación con el sqlite returned: error code = 14, msg = cannot open file at source line 25467
y sqlite3_open_v2("/data/data/com.servision.svclient/databases/servision.db", &handle, 1, NULL) failed
Error, esto parece ser causado cuando no hay base de datos y Android intenta crear uno.
Algunos leyendo aquí
http://androidblogger.blogspot.com/2011/02/instable-android-and-unable-to-open.html
http://www.itsalif.info/content/check-if-database-exist-android-sqlite3openv2-failed
Compruebe los permisos en el manifiesto agregue
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Cuando conseguí este error utilicé este código para mi constructor
public DBClass(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); context.openOrCreateDatabase(DATABASE_NAME, context.MODE_PRIVATE, null); }
Tenía un problema con mi aplicación, donde el cambio de mi archivo datebase con una fecha antigua después de una reinstalación de la aplicación me dio ese error. Supongo que el problema era que el propietario del archivo DB antiguo no era el mismo que el propietario de los archivos de la aplicación reinstalada. Así que se resolvió dando el nuevo archivo de permisos completos (777) por lo que podría ser leído por otros usuarios también.
Al final, asegúrese de que no tiene un problema de permisos de archivo.
Tuve un problema similar y aquí es cómo lo resolví:
https://stackoverflow.com/a/22743794/1947094
Para resumir:
adb shell cd /data/data/YOUR.APP.PACKAGE/databases/ ls
Esto le proporciona una lista de las bases de datos utilizadas por su aplicación.
cp your_database.db your_database.db_backup rm your_database.db
Ya bug planteado en este enlace
http://code.google.com/p/android/issues/detail?id=949
Utilizar el siguiente api …
Context.openOrCreateDatabase ("sample.db", MODE_PRIVATE, null);
Prueba este enlace
http://www.itsalif.info/content/check-if-database-exist-android-sqlite3openv2-failed