我正在开发一个使用由 sqlcipher 加密的数据库的应用程序。此加密的密码由缓存字存储。
为了备份我的数据库,我使用了以下代码:
// ggf. Datenbank öffnen
openGuard();
mDb.execSQL("ATTACH DATABASE '" + outFileName + "' AS backup KEY 'asdfghjkl';");
mDb.rawExecSQL("SELECT sqlcipher_export('backup');");
mDb.execSQL("DETACH DATABASE backup;");
方法 openGuard() 用于检查数据库是否已打开,如果未打开则执行此操作。
我已经使用空密钥检查了备份,以制作我的数据库的未加密副本。然后我可以在 adb shell 上使用它并使用 sql-statements 来获取想要的数据。
我现在很长一段时间的问题是我无法使用我的备份来恢复我的应用程序的数据库。我试过这段代码:
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(backupFile, "asdfghjkl", null);
db.execSQL("ATTACH DATABASE '" + dbFile + "' AS encrypted KEY '" + mCacheWord.getEncryptionKey() + "';");
db.rawExecSQL("SELECT sqlcipher_export('encrypted')");
db.rawExecSQL("DETACH DATABASE encrypted;");
或者我试过
db.execSQL("ATTACH DATABASE '" + dbFile + "' AS encrypted KEY '" + encodeRawKey(mCacheWord.getEncryptionKey()) + "';");
但在这两种情况下,我都会收到以下错误消息:
10-30 00:56:42.845: I/Database(14407): sqlite returned: error code = 26, msg = statement aborts at 5: [ATTACH DATABASE '/data/data/.../databases/database.db' AS encrypted KEY '[B@42082da0';] file is encrypted or is not a database
10-30 00:56:42.845: E/Database(14407): Failure 26 (file is encrypted or is not a database) on 0x63bdedb0 when executing 'ATTACH DATABASE '/data/data/.../databases/database.db' AS encrypted KEY '[B@42082da0';'
有没有人可以帮助我解决我的问题?