SQLiteCantOpenDatabaseException: errore sconosciuto (codice 14) impossibile aprire il database

Ricevo questo errore quando cerco di ottenere un leggibile e scrivibile database.
“SQLiteCantOpenDatabaseException: errore sconosciuto (codice 14) impossibile aprire il database”
Sto avendo questo problema strano con SQLiteOpenHelper e ho visto un po ‘ simili rispondere su questo stesso problema qui, ma nessuno di loro ha risolto il mio problema.
Come disperato come lo sono io, sto postando il mio codice riportato di seguito nella speranza di qualcuno, per trovare qualcosa che non riesco a vedere…

(Una importante informazione: ho questa app da un altro lavoro. Ma il primo tempo ho il debug, non ho ancora cambiato il dbname. Che è stato con il nome dell’app precedente (ff.db). Questo db esiste a mio debug dispositivo, ma tr.db non)

Mio DatabaseHelper classe è simile a questo:

//Singleton
private static DatabaseHelper sInstance;

//Log
private static String TAG = "Database";

private static final String NAME_DB = "tr.db";
private static final String PATH_DB_DEBUG = "/mnt/sdcard/";
private static final int VERSION = 4;

//TABLE NAMES
private static final String TABLE_USERS = "users";
private static final String TABLE_TRACKS = "tracks";
private static final String TABLE_ROTAS = "rotas";
...
/**
     *
     * @param context
     * @return Unique instance of DataBaseHelper
     */
    public static synchronized DatabaseHelper getInstance(Context context) {
        if (sInstance == null) {
            sInstance = new DatabaseHelper(context.getApplicationContext());
        }
        return sInstance;
    }

mio android manifest:

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

E nell’attività principale:

    //DB
    DatabaseHelper database;
...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
...
        //database
        database = DatabaseHelper.getInstance(this.getApplicationContext());
        database.getReadableDatabase(); ( <- Error HERE)

Questo è l’intero stack di errore:

> 12-13 15:02:43.798    5764-5764/com.snitram.toriders E/SQLiteLog (14)
> cannot open file at line 31307 of [2ef4f3a5b1] 12-13 15:02:43.798   
> 5764-5764/com.snitram.toriders E/SQLiteLog (14) os_unix.c:31307: (2)
> open(/storage/emulated/0tr.db) - 12-13 15:02:43.811   
> 5764-5764/com.snitram.toriders E/SQLiteDatabase Failed to open
> database '/storage/emulated/0tr.db'.
>     android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
>             at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
>             at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:207)
>             at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:191)
>             at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
>             at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
>             at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
>             at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
>             at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
>             at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
>             at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:571)
>             at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:269)
>             at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
>             at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
>             at com.snitram.toriders.activities.LoginActivity.onCreate(LoginActivity.java:222)
>             at android.app.Activity.performCreate(Activity.java:6245)
>             at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130)
>             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
>             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)
>             at android.app.ActivityThread.-wrap11(ActivityThread.java)
>             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)
>             at android.os.Handler.dispatchMessage(Handler.java:102)
>             at android.os.Looper.loop(Looper.java:148)
>             at android.app.ActivityThread.main(ActivityThread.java:5443)
>             at java.lang.reflect.Method.invoke(Native Method)
>             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
>             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 12-13
> 15:02:43.814    5764-5764/com.snitram.toriders E/SQLiteOpenHelper
> Couldn't open /storage/emulated/0tr.db for writing (will try
> read-only):
>     android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
>             at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
>             at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:207)
>             at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:191)
>             at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
>             at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
>             at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
>             at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
>             at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
>             at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
>             at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:571)
>             at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:269)
>             at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
>             at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
>             at com.snitram.toriders.activities.LoginActivity.onCreate(LoginActivity.java:222)
>             at android.app.Activity.performCreate(Activity.java:6245)
>             at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130)
>             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
>             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)
>             at android.app.ActivityThread.-wrap11(ActivityThread.java)
>             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)
>             at android.os.Handler.dispatchMessage(Handler.java:102)
>             at android.os.Looper.loop(Looper.java:148)
>             at android.app.ActivityThread.main(ActivityThread.java:5443)
>             at java.lang.reflect.Method.invoke(Native Method)
>             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
>             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 12-13
> 15:02:43.815    5764-5764/com.snitram.toriders E/SQLiteLog﹕ (14)
> cannot open file at line 31307 of [2ef4f3a5b1] 12-13 15:02:43.815   
> 5764-5764/com.snitram.toriders E/SQLiteLog﹕ (14) os_unix.c:31307: (2)
> open(/storage/emulated/0tr.db) - 12-13 15:02:43.816   
> 5764-5764/com.snitram.toriders E/SQLiteDatabase﹕ Failed to open
> database '/storage/emulated/0tr.db'.
>     android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
>             at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
>             at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:207)
>             at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:191)
>             at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
>             at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
>             at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
>             at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
>             at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
>             at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
>             at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:234)
>             at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
>             at com.snitram.toriders.activities.LoginActivity.onCreate(LoginActivity.java:222)
>             at android.app.Activity.performCreate(Activity.java:6245)
>             at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130)
>             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
>             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)
>             at android.app.ActivityThread.-wrap11(ActivityThread.java)
>             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)
>             at android.os.Handler.dispatchMessage(Handler.java:102)
>             at android.os.Looper.loop(Looper.java:148)
>             at android.app.ActivityThread.main(ActivityThread.java:5443)
>             at java.lang.reflect.Method.invoke(Native Method)
>             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
>             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 12-13
> 15:02:43.816    5764-5764/com.snitram.toriders D/AndroidRuntime
> Shutting down VM 12-13 15:02:43.817    5764-5764/com.snitram.toriders
> E/AndroidRuntime FATAL EXCEPTION: main
>     Process: com.snitram.toriders, PID: 5764
>     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.snitram.toriders/com.snitram.toriders.activities.LoginActivity}:
> android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error
> (code 14): Could not open database
>             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426)
>             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)
>             at android.app.ActivityThread.-wrap11(ActivityThread.java)
>             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)
>             at android.os.Handler.dispatchMessage(Handler.java:102)
>             at android.os.Looper.loop(Looper.java:148)
>             at android.app.ActivityThread.main(ActivityThread.java:5443)
>             at java.lang.reflect.Method.invoke(Native Method)
>             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
>             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
>      Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error
> (code 14): Could not open database
>             at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
>             at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:207)
>             at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:191)
>             at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
>             at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
>             at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
>             at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
>             at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
>             at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
>             at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:234)
>             at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
>             at com.snitram.toriders.activities.LoginActivity.onCreate(LoginActivity.java:222)
>             at android.app.Activity.performCreate(Activity.java:6245)
>             at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130)
>             at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
>             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)
>             at android.app.ActivityThread.-wrap11(ActivityThread.java)
>             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)
>             at android.os.Handler.dispatchMessage(Handler.java:102)
>             at android.os.Looper.loop(Looper.java:148)
>             at android.app.ActivityThread.main(ActivityThread.java:5443)
>             at java.lang.reflect.Method.invoke(Native Method)
>             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
>             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Perché hai codificare questo divertente percorso private static final String PATH_DB_DEBUG = "/mnt/sdcard/";?
Ho fatto questo per evitare di root il mio dispositivo per controllare il database. Così, ha fatto il seguente costruttore: private DatabaseHelper(Context context) { super(context, (BuildConfig.BUILD_TYPE == "debug") ? PATH_DB_DEBUG + DB_NAME : DB_NAME, null, VERSION); } Questo ha funzionato per altre due app, ma ricevo questo errore a questo.
Si dovrebbe sviluppare attraverso un emulatore. Solo dopo aver soddisfatto, utilizzare il dispositivo per il test finali. Comunque, il percorso è divertente, perché non tutti i dispositivi di montare la sdcard in quel percorso.
Grazie per l’apertura ai miei occhi. Ho rimosso il divertente percorso e ora si sta lavorando. C’è un sicuro percorso di archiviazione per l’uso?
Si deve eseguire il debug il percorso e vedere che cosa vuol tornare. Forse, a giocherellare un po ‘ di tutto. O provare altro Ambiente metodi per ottenere diversi percorsi.

OriginaleL’autore Totalys | 2015-12-13

2 Replies
  1. 8

    Si utilizza SQLiteDatabase.openDatabase sul percorso di un file che non esiste. Aggiungi al di sotto di 2 righe prima SQLiteDatabase.openDatabase chiamata

       private boolean checkDataBase() {
        SQLiteDatabase checkDB = null;
        try {
    
            String myPath = DB_PATH + DB_NAME;
    
            File file = new File(myPath);
            if (file.exists() && !file.isDirectory())
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
        } catch (SQLiteException e) {
            // database does't exist yet.
        }
    
        if (checkDB != null) {
            checkDB.close();
        }
    
        return checkDB != null ? true : false;
    }

    OriginaleL’autore Amit

  2. 5

    Errore smesso di mostrare dopo che ho cambiato il targetSdkVersion da 23 a 22.
    Questo downgrade costretto a disinstallare il pacchetto del dispositivo, e quando È stato reinstallato ha funzionato bene. Grazie Frank N. Stein per l’aiuto!

    Questo è un vecchio post so, però questa soluzione ha funzionato per me. Potete per favore spiegare cosa è accaduto esattamente che ha aiutato a risolvere il problema?

    OriginaleL’autore Totalys

Lascia un commento