在Android中使用sqlcipher后,获取“sqlite3_open_v2(”mydatabase.db“,& handle,6,NULL)失败

时间:2012-07-25 10:56:59

标签: android sqlcipher

在Android 2.3.3中使用sqlcipher时。我收到了错误。

这是我的DB.java类

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();
            }
        }
    }


}

我创建DB.java的对象并像这样使用它

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

一旦执行此行_db.insertValuesInTable();,我就会收到此错误

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)

我已正确包含所有.so.jar&amp; .zip个文件。我仍然得到这个错误。怎么解决这个问题?

1 个答案:

答案 0 :(得分:2)

您应该创建android.app.Application的子类,并在AndroidManifest.xml文件中注册它。在致电SQLiteDatabase.openOrCreateDatabase之前,请通过从应用程序实例调用getDatabasePath获取数据库文件的完整路径,并将该值传递给SQLiteDatabase.openOrCreateDatabase