为我的Android应用程序提供使用sqlcipher加密的数据库无法正常工作,无法打开它

时间:2015-10-14 07:22:06

标签: android encryption android-sqlite sqlcipher

我的Android应用程序适用于填充并位于asset文件夹中的提供的数据库。我最近不得不开始在其中添加私有数据,因此我使用sqlcipher对其进行加密。所以在开始之前:

  • 加密进展顺利,因为我可以轻松解密并阅读它。这是通过sqlcipher shell完成的。

  • 所有东西都像db一样没有加密的魅力

我正在做的是,在我的应用程序的第一次启动时,在我的手机上创建一个空白数据库,复制并通过其中提供的数据库的内容,然后,用户能够拥有自己的数据库电话,而不必每次都重新创建它(数据库非常大)。实际上,如果用户已经在他的手机上安装了数据库以进行进一步的发布,他就不必以这种方式重新创建它。

但是sqlcipher,它已经无法使用了。

重要:当使用带有非加密数据库的sqlcipher时(使用""作为openDatabase等相关方法的参数),它也可以正常工作。

但是当我尝试使用加密的数据库和密码时,我所拥有的是错误

file is encrypted or is not a database: create locale table failed

使用以下方法创建空白数据库后会发生这种情况:

    //By calling this method and empty database will be created into the default system path
    //of your application so we are gonna be able to overwrite that database with our database.
    this.getReadableDatabase("password").close();

然后我尝试按照以下说明打开它:

//Open the database
        String myPath = DB_PATH + DATABASE_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, "password", null, SQLiteDatabase.OPEN_READWRITE);

然后发生错误。有人有想法吗?我很遗憾不是一个Android专家,使用数据库已经很困难了,但你可以猜到它现在正处于另一个层面。欢迎任何帮助。提前谢谢!

1 个答案:

答案 0 :(得分:1)

最后通过以下链接进行长时间搜索后解决我的问题:Sqlcipher __ CREATE TABLE android_metadata failed

错误来自我打开数据库的方式,这会改变您使用sqlcipher还是sqlite

使用sqlite打开数据库的旧方法:

myDataBase = SQLiteDatabase.openDatabase(myPath, "password", null, SQLiteDatabase.OPEN_READWRITE);

使用sqlcipher的新方式,SQLiteDatabaseHook

SQLiteDatabaseHook hook = new SQLiteDatabaseHook() {
            public void preKey(SQLiteDatabase database) {
            }

            public void postKey(SQLiteDatabase database) {
                database.rawExecSQL("PRAGMA cipher_migrate;");

            }
        };


        myDataBase = SQLiteDatabase.openOrCreateDatabase(myPath, "password", null, hook);