sqlcipher - Error: file is not a database
既然我们已经获得了加密数据库的密码,但是为什么还是打不开数据库文件呢?这个问题在sqlcipher事件讨论中得到了解答:
-
问题解决: Upgrading to SQLCipher 4-将数据库文件升级到4版本
一、问题解决:
出现这个错误的原因是 解密的工具和加密文件的工具版本不一致 导致的,我们下载的 sqlcihper 源码是4.33版本的,而我们的数据库文件是由 sqlcihper3 加密得到的。sqlcipher4不提供对1-3数据库文件的解密。
1.1 sqlcipher版本查看:
$ sqlcipher --version $ sqlcipher /home/apple/shared_nfs/EnMicroMsg.db sqlite> PRAGMA cipher_version; sqlite> PRAGMA key = 'yourkey';
1.2 问题的解决:
进行数据库文件迁移(cipher_migration),这个操作只需要进行一次,将数据库文件变成适合四版本的db文件。
sqlite> PRAGMA key = 'yourkey'; # 这个操作需要等待一些时间,命令行输出0即表示数据文件迁移成功 sqlite> PRAGMA cipher_migrate; # 查看数据库是否解密成功 sqlite> SELECT count(1) FROM sqlite_master; sqlite> .q
1.3 创建明文数据库:
在以后进行数据库操作前,首先设置密码,或者第一次进入就设置好。
# 进入EnMicroMsg.db所在目录 $ sqlcipher sqlite> .open/home/apple/shared_nfs/EnMicroMsg.db # 打开已有数据库 sqlite> PRAGMA key = 'yourkey'; # 首先输入密码 sqlite> .output 'MicroMsg.sql' # 转储/备份 数据库前先指定输出文件 sqlite> .dump # 备份数据库 sqlite> .open DeMicroMsg.db # 打开一个新的数据库, 无则创建 sqlite> .read 'MicroMsg.sql' # 执行sql文件,恢复到空数据库 sqlite> .databases # 查看数据库列表 sqlite> SELECT count(1) FROM sqlite_master; # 执行SQL语句 sqlite> .q # 退出