coderslay
coderslay

Reputation: 14370

Getting "sqlite3_open_v2("mydatabase.db", &handle, 6, NULL) failed" after using sqlcipher in Android

While using sqlcipher in Android 2.3.3. I am getting error.

Here is my DB.java class

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.util.Log;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteDatabase.CursorFactory;
import net.sqlcipher.database.SQLiteOpenHelper;

public class DB {

private static String _DB_NAME = "mydatabase.db";
private static int _DB_VERSION = 1;

private Context _context;
private DBHelper _helper;

public DB(Context context) {
SQLiteDatabase.loadLibs(context);
this._context = context;
this._helper = new DBHelper(this._context, _DB_NAME, null, _DB_VERSION);
SQLiteDatabase sqdb = this._helper.getWritableDatabase("123");
sqdb.close();
}

public void insertValuesInTable() {

try {
SQLiteDatabase sqdb = SQLiteDatabase.openOrCreateDatabase(_DB_NAME, "123",null);
sqdb.execSQL("insert into mytable(category, total) values (1,"100");");
sqdb.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private static class DBHelper extends SQLiteOpenHelper {

        public DBHelper(Context context, String name, CursorFactory factory,
                int version) {

            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

            createTables(db);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        }

        private void createTables(SQLiteDatabase db) {

            try {
                String query1;

                query1 = "Create table if not exists mytable (category integer primary key, total text) ;   ";
                db.execSQL(query1);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


}

I create the object of DB.java and make use of it like this

DB _db = new DB(getApplicationContext());
_db.insertValuesInTable();

As soon as i execute this line _db.insertValuesInTable(); I get this error

sqlite returned: error code = 14, msg = cannot open file at line 32288 of [6d326d44fd]
sqlite returned: error code = 14, msg = os_unix.c:32288: (2) open(//mydatabase.db) - 
sqlite3_open_v2("mydatabase.db", &handle, 6, NULL) failed
net.sqlcipher.database.SQLiteException: unable to open database file
net.sqlcipher.database.SQLiteDatabase.dbopen(Native Method)
net.sqlcipher.database.SQLiteDatabase.<init>(SQLiteDatabase.java:1952)
net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:902)
net.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:945)
com.keane.database.DB.insertValuesInMd5Check(DB.java:133)
com.keane.test2.UsageMonitorTestActivity.onCreate(UsageMonitorTestActivity.java:45)
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
android.app.ActivityThread.access$1500(ActivityThread.java:117)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:123)
android.app.ActivityThread.main(ActivityThread.java:3683)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:507)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
dalvik.system.NativeStart.main(Native Method)

I have properly included all the .so ,.jar & .zip files. Still i am getting this error.How to solve this?

Upvotes: 1

Views: 4390

Answers (1)

Nick Parker
Nick Parker

Reputation: 1388

You should create a subclass of android.app.Application, and register it within your AndroidManifest.xml file. Before you call SQLiteDatabase.openOrCreateDatabase, get the full path to the database file by calling getDatabasePath from your application instance and pass that value to SQLiteDatabase.openOrCreateDatabase.

Upvotes: 2

Related Questions