Android SQLcipher PRAGMA问题

时间:2012-11-24 00:01:48

标签: android pragma sqlcipher

嘿伙计我在使用SQLcipher db for android时遇到了一些问题 文档不太具描述性,所以我无法弄明白。

我正在尝试修改sqlcipher for android的默认迭代次数, 我正在编辑使用sqlcipher作为演示应用程序提供的notecipher应用程序,并希望将kdf_iter增加到5000

通过覆盖数据库帮助程序中的getWritableDatabase()方法,我在密码打开文件后输入pragma值。

我可以打开并初始化数据库,但如果我执行database.close()调用,则无法重新打开数据库。

每当我在下一个open()调用中关闭数据库时,我得到一个:

I/Database(807): sqlite returned: error code = 26, msg = file is encrypted or is not a database
E/Database(807): CREATE TABLE android_metadata failed
E/Database(807): Failed to setLocale() when constructing, closing the database
E/Database(807): info.guardianproject.database.sqlcipher.SQLiteException: file is encrypted or is not a database

2 个答案:

答案 0 :(得分:2)

您希望使用SQLiteDatabaseHook对象来调用kdf_iter pragma。这将确保在打开数据库之后但在使用之前立即调用pragma。

SQLiteDatabaseHook hook = new SQLiteDatabaseHook(){
  public void preKey(SQLiteDatabase database){
    database.rawExecSQL("PRAGMA kdf_iter = 5000");
  }
  public void postKey(SQLiteDatabase database){}
}

SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databasePath, password, null, hook);

答案 1 :(得分:1)

@Stephen答案只是部分正确,因为根据documentation

  

PRAGMA kdf_iter必须在 PRAGMA键之后和第一次实际数据库操作之前调用,否则它将无效。

所以行:

  

database.rawExecSQL(" PRAGMA kdf_iter = 5000");

必须插入postKey()方法,而不是preKey()。
这对我有用。