Android SQLiteOpenHelper non può aprire il file di database

So che quell’argomento era già stato discusso prima. Ma non posso trovare una soluzione al mio problema, quindi vado a chiedere ancora una volta. Ho problemi con la creazione del database. Ive ha copiato l’implementazione di 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; } } 

e lo creo dal metodo onCreate dell’attività principale come questo.

 DBCreator db =new DBCreator(this); db.getReadableDatabase(); 

in logcat ricevo le seguenti informazioni:

 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.(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 di DBCreator non viene mai chiamato. Im programma in esecuzione su Galaxy S in modalità di debug da Eclipse. Mi mancano alcune autorizzazioni? Può essere il contesto non è buono o qualcosa del genere?

In relazione allo sqlite returned: error code = 14, msg = cannot open file at source line 25467 e sqlite3_open_v2("/data/data/com.servision.svclient/databases/servision.db", &handle, 1, NULL) failed errore, questo sembra essere causato quando non ci sono database e Android cerca di crearne uno.

Qualche lettura qui

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

http://code.google.com/p/android/issues/detail?id=949

controlla i permessi nel tuo manifest

  

Quando ho ricevuto questo errore ho usato questo codice per il mio costruttore

 public DBClass(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); context.openOrCreateDatabase(DATABASE_NAME, context.MODE_PRIVATE, null); } 

Stavo avendo un problema con la mia app, in cui la modifica del mio file database con una vecchia base dati dopo una reinstallazione dell’app mi ha dato quell’errore. Immagino che il problema era che il proprietario del vecchio file DB non era lo stesso del proprietario dei file per l’app reinstallata. Quindi è stato risolto dando il nuovo file pieno di permessi (777) in modo che potesse essere letto anche da altri utenti.

Alla fine, assicurati di non avere un problema con i permessi dei file.

Ho avuto un problema simile ed ecco come ho risolto:

https://stackoverflow.com/a/22743794/1947094

Per riassumere:

 adb shell cd /data/data/YOUR.APP.PACKAGE/databases/ ls 

Questo ti dà una lista dei database usati dalla tua app.

 cp your_database.db your_database.db_backup rm your_database.db 

già bug sollevato in questo link

http://code.google.com/p/android/issues/detail?id=949

usa la seguente api …

context.openOrCreateDatabase (“sample.db”, MODE_PRIVATE, null);

prova questo link

http://www.itsalif.info/content/check-if-database-exist-android-sqlite3openv2-failed