Я обновил Sqlcipher для Android с 3.5.7 до 4.1.3 в своем приложении.
Для существующей базы данных, которая была создана с помощью Sqlcipher 3, мне нужна пользовательская миграция, поскольку она основана на пользовательских параметрах, а также опция 3 из , описанная в этой статье .
Я получаю это исключение при попытке открыть базу данных.
net.sqlcipher.database.SQLiteException: file is not a database: , while compiling: select count(*) from sqlite_master;
at net.sqlcipher.database.SQLiteCompiledSql.native_compile(Native Method)
Это мой код:
SQLiteDatabaseHook mHook = new SQLiteDatabaseHook() {
public void preKey(SQLiteDatabase database) {
database.rawExecSQL("PRAGMA kdf_iter=1000;");
database.rawExecSQL("PRAGMA cipher_default_kdf_iter=1000;");
database.rawExecSQL("PRAGMA cipher_page_size = 4096;");
}
public void postKey(SQLiteDatabase database) {
database.rawExecSQL("PRAGMA cipher_compatibility=3;");
}
};
// this line generate the exception
SQLiteDatabase database = SQLiteDatabase.openDatabase(oldDatabaseFile.getAbsolutePath(), password, null, SQLiteDatabase.OPEN_READWRITE, mHook);
...
// migration code with ATTACH, sqlcipher_export etc...
...
Файл существует и пароль правильный: тот же фрагмент кода работает, если я понижаю версию библиотеки Sqlcipher. Что я делаю не так?