Android пользовательская миграция Sqlcipher от 3 до 4 - PullRequest
2 голосов
/ 11 апреля 2019

Я обновил 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. Что я делаю не так?

...