首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓SQLcipher PRAGMA问题

安卓SQLcipher PRAGMA问题
EN

Stack Overflow用户
提问于 2012-11-24 08:01:48
回答 2查看 2.4K关注 0票数 1

嘿,伙计们,我在安卓系统的SQLcipher数据库上遇到了一些问题,文档不太具描述性,所以我想不出来。

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

通过覆盖数据库帮助器中的getWritableDatabase()方法,我在使用密码打开文件后立即输入杂注。

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

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-09 22:32:15

@Stephen的回答只有部分正确,因为根据documentation

PRAGMA kdf_iter必须在 PRAGMA key之后、第一次实际数据库操作之前调用,否则将不起作用。

所以这句话:

这对我很有效。

票数 1
EN

Stack Overflow用户

发布于 2012-11-26 02:19:27

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

代码语言:javascript
复制
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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13537073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档