根据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"); ,它会运行良好。
有人知道这个问题吗?
感谢。
答案 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