SQLite Forum

sqlite-android-3360000.aar / SQLiteOpenHelper / getWritableDatabase() / unknown error (code 14): Could not open database
Login

sqlite-android-3360000.aar / SQLiteOpenHelper / getWritableDatabase() / unknown error (code 14): Could not open database

(1) By BlackGB on 2021-09-18 11:36:43 updated by 1.1 [source]

keywords: sqlite-android-3360000.aar / SQLiteOpenHelper / getWritableDatabase() / unknown error (code 14): Could not open database

Hi,
Something seems strong in the new SQLiteOpenHelper class of the sqlite-android-3360000.aar build.
I want to use that version because the default SDK version don't support RTREE compilation option.



Here is a part of my main Activity code to testing :
try {
    System.loadLibrary("sqliteX");

    AppDB appDB = new AppDB(getApplicationContext());

    Log.d("MainActivity", appDB.getDatabaseName());
    Log.d("MainActivity",this.getDatabasePath(appDB.getDatabaseName()).toString());
    Log.d("MainActivity",getApplicationContext().getDatabasePath(appDB.getDatabaseName()).toString());

    SQLiteDatabase _bdd = appDB.getWritableDatabase();
    Log.d("MainActivity", _bdd.toString());

} catch (Exception e) {
    Log.e("MainActivity", e.toString());
}

First try with default SqlLite library and who work fine:
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
//import org.sqlite.database.sqlite.SQLiteDatabase;
//import org.sqlite.database.sqlite.SQLiteOpenHelper;

public class AppDB extends SQLiteOpenHelper {

    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "MyBuoy.db3";

    public AppDB(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        //super(context, context.getDatabasePath(DATABASE_NAME).getPath(), null, DATABASE_VERSION);
    }
    
    ../..
} 

The Logs are :
2021-09-18 13:22:04.058 29266-29266/com.gb.mybuoy D/MainActivity: MyBuoy.db3
2021-09-18 13:22:04.059 29266-29266/com.gb.mybuoy D/MainActivity: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3
2021-09-18 13:22:04.066 29266-29266/com.gb.mybuoy D/MainActivity: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3
2021-09-18 13:22:09.878 29266-29266/com.gb.mybuoy D/MainActivity: SQLiteDatabase: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3


Second try with sqlite-android-3360000.aar build and failed with unknown error (code 14): Could not open database:
//import android.database.sqlite.SQLiteDatabase;
//import android.database.sqlite.SQLiteOpenHelper;
import org.sqlite.database.sqlite.SQLiteDatabase;
import org.sqlite.database.sqlite.SQLiteOpenHelper;

public class AppDB extends SQLiteOpenHelper {

    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "MyBuoy.db3";

    public AppDB(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        //super(context, context.getDatabasePath(DATABASE_NAME).getPath(), null, DATABASE_VERSION);
    }
    
    ../..
} 

The Logs are :
2021-09-18 13:25:01.226 29518-29518/com.gb.mybuoy D/MainActivity: MyBuoy.db3
2021-09-18 13:25:01.227 29518-29518/com.gb.mybuoy D/MainActivity: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3
2021-09-18 13:25:01.228 29518-29518/com.gb.mybuoy D/MainActivity: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3
2021-09-18 13:25:22.772 29518-29518/com.gb.mybuoy E/SQLiteDatabase: Failed to open database 'MyBuoy.db3'.
    org.sqlite.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
        at org.sqlite.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
        at org.sqlite.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:214)
        at org.sqlite.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:198)
        at org.sqlite.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:466)
        at org.sqlite.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:188)
        at org.sqlite.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:180)
        at org.sqlite.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:810)
        at org.sqlite.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:795)
        at org.sqlite.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:698)
        at org.sqlite.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:721)
        at org.sqlite.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:259)
        at org.sqlite.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:199)
        at com.gb.mybuoy.MainActivity.onRequestPermissionsResult(MainActivity.java:122)
        at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7608)
        at android.app.Activity.dispatchActivityResult(Activity.java:7458)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4353)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4402)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2021-09-18 13:25:25.203 29518-29518/com.gb.mybuoy E/MainActivity: org.sqlite.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database


and Third try with sqlite-android-3360000.aar build and full path database who work fine:
//import android.database.sqlite.SQLiteDatabase;
//import android.database.sqlite.SQLiteOpenHelper;
import org.sqlite.database.sqlite.SQLiteDatabase;
import org.sqlite.database.sqlite.SQLiteOpenHelper;

public class AppDB extends SQLiteOpenHelper {

    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "MyBuoy.db3";

    public AppDB(Context context) {
        //super(context, DATABASE_NAME, null, DATABASE_VERSION);
        super(context, context.getDatabasePath(DATABASE_NAME).getPath(), null, DATABASE_VERSION);
    }
    
    ../..
} 

The Logs are :
2021-09-18 13:28:33.176 29884-29884/com.gb.mybuoy D/MainActivity: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3
2021-09-18 13:28:33.178 29884-29884/com.gb.mybuoy D/MainActivity: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3
2021-09-18 13:28:41.829 29884-29884/com.gb.mybuoy D/MainActivity: SQLiteDatabase: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3



So i investigated and this part of the code seems wrong :
In file SQLiteOpenHelper.class
private SQLiteDatabase getDatabaseLocked(boolean writable) {
    ../..
    
    try {
        db = SQLiteDatabase.openOrCreateDatabase(this.mName, this.mFactory, this.mErrorHandler);
    } catch (SQLiteException var15) {
        if (writable) {
            throw var15;
        }

        Log.e(TAG, "Couldn't open " + this.mName + " for writing (will try read-only):", var15);
        String path = this.mContext.getDatabasePath(this.mName).getPath();
        db = SQLiteDatabase.openDatabase(path, this.mFactory, 1, this.mErrorHandler);
    }
    
    
    ../..
}

Why in the catch case there are a try with this.mContext.getDatabasePath(this.mName) path only in the not writable case ?
Why in the default case  this.mContext.getDatabasePath is not called ?
Why i have to call supper class method like super(context, context.getDatabasePath(DATABASE_NAME).getPath(), null, DATABASE_VERSION) and  pass to the second argument the full path base on the context then the context is in the first argument for that work done ?

The seems strange and seems wrong in that version of SQLiteOpenHelper ?!

sqlite-android-3360000.aar / SQLiteOpenHelper / getWritableDatabase() / unknown error (code 14): Could not open database

(1.1) By BlackGB on 2021-09-18 12:27:27 edited from 1.0 [link] [source]

keywords: sqlite-android-3360000.aar / SQLiteOpenHelper / getWritableDatabase() / unknown error (code 14): Could not open database

Hi, Something seems strong in the new SQLiteOpenHelper class of the sqlite-android-3360000.aar build. I want to use that version because the default SDK version don't support RTREE compilation option.

Here is a part of my main Activity code to testing : try { System.loadLibrary("sqliteX");

AppDB appDB = new AppDB(getApplicationContext());

Log.d("MainActivity", appDB.getDatabaseName());
Log.d("MainActivity",this.getDatabasePath(appDB.getDatabaseName()).toString());
Log.d("MainActivity",getApplicationContext().getDatabasePath(appDB.getDatabaseName()).toString());

SQLiteDatabase _bdd = appDB.getWritableDatabase();
Log.d("MainActivity", _bdd.toString());

} catch (Exception e) { Log.e("MainActivity", e.toString()); }

First try with default SqlLite library and who work fine: import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; //import org.sqlite.database.sqlite.SQLiteDatabase; //import org.sqlite.database.sqlite.SQLiteOpenHelper;

public class AppDB extends SQLiteOpenHelper {

public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "MyBuoy.db3";

public AppDB(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    //super(context, context.getDatabasePath(DATABASE_NAME).getPath(), null, DATABASE_VERSION);
}

../..

} The Logs are : 2021-09-18 13:22:04.058 29266-29266/com.gb.mybuoy D/MainActivity: MyBuoy.db3 2021-09-18 13:22:04.059 29266-29266/com.gb.mybuoy D/MainActivity: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3 2021-09-18 13:22:04.066 29266-29266/com.gb.mybuoy D/MainActivity: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3 2021-09-18 13:22:09.878 29266-29266/com.gb.mybuoy D/MainActivity: SQLiteDatabase: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3

Second try with sqlite-android-3360000.aar build and failed with unknown error (code 14): Could not open database: //import android.database.sqlite.SQLiteDatabase; //import android.database.sqlite.SQLiteOpenHelper; import org.sqlite.database.sqlite.SQLiteDatabase; import org.sqlite.database.sqlite.SQLiteOpenHelper;

public class AppDB extends SQLiteOpenHelper {

public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "MyBuoy.db3";

public AppDB(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    //super(context, context.getDatabasePath(DATABASE_NAME).getPath(), null, DATABASE_VERSION);
}

../..

} The Logs are : 2021-09-18 13:25:01.226 29518-29518/com.gb.mybuoy D/MainActivity: MyBuoy.db3 2021-09-18 13:25:01.227 29518-29518/com.gb.mybuoy D/MainActivity: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3 2021-09-18 13:25:01.228 29518-29518/com.gb.mybuoy D/MainActivity: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3 2021-09-18 13:25:22.772 29518-29518/com.gb.mybuoy E/SQLiteDatabase: Failed to open database 'MyBuoy.db3'. org.sqlite.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database at org.sqlite.database.sqlite.SQLiteConnection.nativeOpen(Native Method) at org.sqlite.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:214) at org.sqlite.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:198) at org.sqlite.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:466) at org.sqlite.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:188) at org.sqlite.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:180) at org.sqlite.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:810) at org.sqlite.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:795) at org.sqlite.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:698) at org.sqlite.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:721) at org.sqlite.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:259) at org.sqlite.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:199) at com.gb.mybuoy.MainActivity.onRequestPermissionsResult(MainActivity.java:122) at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7608) at android.app.Activity.dispatchActivityResult(Activity.java:7458) at android.app.ActivityThread.deliverResults(ActivityThread.java:4353) at android.app.ActivityThread.handleSendResult(ActivityThread.java:4402) at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 2021-09-18 13:25:25.203 29518-29518/com.gb.mybuoy E/MainActivity: org.sqlite.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database

and Third try with sqlite-android-3360000.aar build and full path database who work fine: //import android.database.sqlite.SQLiteDatabase; //import android.database.sqlite.SQLiteOpenHelper; import org.sqlite.database.sqlite.SQLiteDatabase; import org.sqlite.database.sqlite.SQLiteOpenHelper;

public class AppDB extends SQLiteOpenHelper {

public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "MyBuoy.db3";

public AppDB(Context context) {
    //super(context, DATABASE_NAME, null, DATABASE_VERSION);
    super(context, context.getDatabasePath(DATABASE_NAME).getPath(), null, DATABASE_VERSION);
}

../..

} The Logs are : 2021-09-18 13:28:33.176 29884-29884/com.gb.mybuoy D/MainActivity: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3 2021-09-18 13:28:33.178 29884-29884/com.gb.mybuoy D/MainActivity: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3 2021-09-18 13:28:41.829 29884-29884/com.gb.mybuoy D/MainActivity: SQLiteDatabase: /data/user/0/com.gb.mybuoy/databases/MyBuoy.db3

So i investigated and this part of the code seems wrong : In file SQLiteOpenHelper.class private SQLiteDatabase getDatabaseLocked(boolean writable) { ../..

try {
    db = SQLiteDatabase.openOrCreateDatabase(this.mName, this.mFactory, this.mErrorHandler);
} catch (SQLiteException var15) {
    if (writable) {
        throw var15;
    }

    Log.e(TAG, "Couldn't open " + this.mName + " for writing (will try read-only):", var15);
    String path = this.mContext.getDatabasePath(this.mName).getPath();
    db = SQLiteDatabase.openDatabase(path, this.mFactory, 1, this.mErrorHandler);
}


../..

} Why in the catch case there are a try with this.mContext.getDatabasePath(this.mName) path only in the not writable case ? Why in the default case this.mContext.getDatabasePath is not called ? Why i have to call supper class method like super(context, context.getDatabasePath(DATABASE_NAME).getPath(), null, DATABASE_VERSION) and pass to the second argument the full path base on the context then the context is in the first argument for that work done ?

The seems strange and seems wrong in that version of SQLiteOpenHelper ?!

(2) By Dan Kennedy (dan) on 2021-09-18 18:13:50 in reply to 1.1 [link] [source]

I think it's a long-standing bug introduced along with support for file:// style filenames. Can you try with this version?

https://sqlite.org/android/info/97dc797d2f1c589d

Dan.

(3) By BlackGB on 2021-09-18 19:00:13 in reply to 2 updated by 3.1 [link] [source]

Oh nice yes theses codes seem be better.

But i did't build my version and just take the online build here : 
https://sqlite.org/download.html
the Precompiled Binaries for Android: https://sqlite.org/2021/sqlite-android-3360000.aar

and this version have neither the code before nor the code after the support for file://

so maybe the next build could be good ?

(3.1) By BlackGB on 2021-09-18 19:08:59 edited from 3.0 in reply to 2 [link] [source]

Oh nice yes theses codes seem be better.

But i did't build my version and just took the online build here : https://sqlite.org/download.html the Precompiled Binaries for Android: https://sqlite.org/2021/sqlite-android-3360000.aar

and this version have neither the code before nor the code after the support for file://

so maybe the next build/packaging could be good on the good branch ;) ?

(4) By BlackGB on 2021-09-19 09:35:38 in reply to 2 [link] [source]

Oh ok i understood, on the build there are not the DEBUG_STRICT_READONLY part (i forgot that the compiler removes unused code) but your modification seems OK.

so, a big thanks @dan, you are a chief.