reset SQLCipher cipher_page_size导致打开数据库错误

时间:2014-09-25 14:45:04

标签: sqlcipher

根据SQLCipher官方网站的介绍,在" PRAGMA KEY =' testkey';"之后设置cipher_page_size。所以我创建了自己的DatabaseHelper,如下所示:

public class DatabaseHelper extends SQLiteOpenHelper {  

private final static String NEWDBNAME="my.db" ;  
public DatabaseHelper(Context context){  
    super(context, NEWDBNAME, null, 0 ,new SQLiteDatabaseHook(){

         @Override
        public void postKey(SQLiteDatabase arg0) {
            arg0.rawExecSQL("PRAGMA cipher_page_size = 4096");
        }

         @Override
        public void preKey(SQLiteDatabase arg0) {
        }});  
    }  
    public void onCreate(SQLiteDatabase db) {      }  
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }
    public SQLiteDatabase getWritableDatabase()
    {
        return getWritableDatabase("encodestr");
    }
}  

问题是我的android应用程序会出现如下错误:文件不是db或者是encripted ......

当我评论时://arg0.rawExecSQL(" PRAGMA cipher_page_size = 4096"); ,它会运行良好。

有人知道这个问题吗?

感谢。

1 个答案:

答案 0 :(得分:0)

如果数据库已存在,除非最初在cipher_page_size设置为4096的情况下创建,否则您需要使用新设置导出加密数据库。这样做将允许将所有页面重写为新的块大小。一个例子:

$ ./sqlcipher foo.db
sqlcipher> PRAGMA key = 'foo';
sqlcipher> create table t1(a,b);
sqlcipher> insert into table t1(a,b) values('one for the money', 'two for the show');
sqlcipher> .q

现在foo.db的默认cipher_page_size为1024,让我们使用新的cipher_page_size 4096导出数据库:

$ ./sqlcipher foo.db
sqlcipher> PRAGMA key = 'foo';
sqlcipher> ATTACH DATABASE 'bar.db' as bar KEY 'foo';
sqlcipher> PRAGMA bar.cipher_page_size = 4096;
sqlcipher> SELECT sqlcipher_export('bar');
sqlcipher> DETACH database bar;
sqlcipher> .q

现在我们需要在查询数据库时指定cipher_page_size

$ ./sqlcipher bar.db
sqlcipher> PRAGMA key = 'foo';
sqlcipher> PRAGMA cipher_page_size = 4096;
sqlcipher> SELECT count(*) from sqlite_master;
count(*)
----------
1