我有一个巨大的问题...我正在开发一个桌面应用程序与SQLite,但在复制/粘贴过程中,我失去了权力,该进程被终止,所以数据库丢失。然而,我找到了一种方法来恢复它,但数据库是加密的。当我试图打开一个连接使用conn.Open();我得到的错误:“SQLITE被加密或不是数据库”。如果我尝试用SQLite的DB Browser打开它,它会询问我SQLCipher加密密码,所以在我看来数据丢失了。是否有默认密码?为什么会发生这种情况?如何防止再次发生?我该怎么做?先谢了。
conn.Open();
vatpfxk51#
还要检查您正在“连接”的SQLite版本是否与DB文件版本一致。例如,下面是一个由SQLite版本3+编写的DB文件:
$ file foobar.db foobar.db: SQLite 3.x database, last written using SQLite version 3027002
这里我还有两个版本的sqlite:
$ sqlite -version 2.8.17 $ sqlite3 -version 3.27.2 2019-02-25 16:06:06 bd49a8271d650fa89e446b42e513b595a717b9212c91dd384aab871fc1d0alt1
显然,事后看来,用sqlite version 2打开foobar.db将失败,并产生相同的错误消息:
foobar.db
$ sqlite foobar.db Unable to open database "foobar.db": file is encrypted or is not a database
但只要有正确的版本,一切都很好:
$ sqlite3 foobar.db SQLite version 3.27.2 2019-02-25 16:06:06 Enter ".help" for usage hints. sqlite> sqlite> .databases main: /tmp/foobar.db sqlite>
错误消息是一个包罗万象的问题,它仅仅意味着无法识别文件格式。
vvppvyoh2#
好吧,终于找到了一个解决方案,所以张贴答案,如果有人会有同样的麻烦,因为我没有。首先,使用好的恢复软件。对于修复数据库,我发现3没有备份的解决方案:1.使用数据库浏览器打开损坏的数据库并将数据库导出到SQL。您可以随意命名它。然后,创建新数据库并从SQL导入数据库。1.有修复损坏的数据库的软件。请下载一个并使用它来修复数据库。1.从www.example.com下载“sqlite3”sqlite.org,并在命令行中导航到解压“sqlite3”的文件夹,然后尝试使用.dump转储整个数据库,并使用这些命令创建一个新数据库:
sqlite3 corrupt_table_name.sqlite ".dump" | sqlite3 new.sqlite
mv1qrgav3#
当我尝试在另一个系统中访问一个数据库转储时,我遇到了同样的错误。当我尝试在一台开发机器上打开时,它在这个线程中抛出了报告的错误:
$ sqlite3 db_dump.sqlite .tables Error: file is encrypted or is not a database
这是由于这些系统之间的sqlite版本的差异。这个开发系统的版本是3. 6. 20。生产系统上的版本是3.8.9。我将sqlite3升级到相同版本后,就可以访问其所有数据。我只是在下面显示了预期显示的表格:
# sqlite3 -version 3.8.9 # sqlite3 db_dump.sqlite .tables capture diskio transport consumer filters processes
不过,这个错误一开始就很容易误导人。
flvlnr444#
如果您在指定journal_mode = WAL时与数据库进行了交互,然后尝试从不支持WAL(〈v3.7.0)的客户端使用数据库,也会出现此错误。As noted in the SQLite documentation under Backwards Compatibility,要解决此问题而不必重新创建数据库,请将日志模式显式设置为DELETE:
journal_mode = WAL
WAL
DELETE
PRAGMA journal_mode=DELETE;
5w9g7ksd5#
您的数据库未加密(这只是错误消息中的两个选项之一)。您的数据恢复工具没有恢复正确的数据;你在档案里找到的是别的东西。必须从备份中还原数据库文件。
arknldoa6#
问题是与sqlcipher版本升级在我的情况下,每当我更新我的pod它自动升级sqlcipher和错误发生。快速修复只需手动添加SDK而不是Pod安装。正确的解决方案请使用此链接GitHub Solution
6条答案
按热度按时间vatpfxk51#
还要检查您正在“连接”的SQLite版本是否与DB文件版本一致。
例如,下面是一个由SQLite版本3+编写的DB文件:
这里我还有两个版本的sqlite:
显然,事后看来,用sqlite version 2打开
foobar.db
将失败,并产生相同的错误消息:但只要有正确的版本,一切都很好:
错误消息是一个包罗万象的问题,它仅仅意味着无法识别文件格式。
vvppvyoh2#
好吧,终于找到了一个解决方案,所以张贴答案,如果有人会有同样的麻烦,因为我没有。
首先,使用好的恢复软件。对于修复数据库,我发现3没有备份的解决方案:
1.使用数据库浏览器打开损坏的数据库并将数据库导出到SQL。您可以随意命名它。然后,创建新数据库并从SQL导入数据库。
1.有修复损坏的数据库的软件。请下载一个并使用它来修复数据库。
1.从www.example.com下载“sqlite3”sqlite.org,并在命令行中导航到解压“sqlite3”的文件夹,然后尝试使用.dump转储整个数据库,并使用这些命令创建一个新数据库:
mv1qrgav3#
当我尝试在另一个系统中访问一个数据库转储时,我遇到了同样的错误。当我尝试在一台开发机器上打开时,它在这个线程中抛出了报告的错误:
这是由于这些系统之间的sqlite版本的差异。这个开发系统的版本是3. 6. 20。
生产系统上的版本是3.8.9。我将sqlite3升级到相同版本后,就可以访问其所有数据。我只是在下面显示了预期显示的表格:
不过,这个错误一开始就很容易误导人。
flvlnr444#
如果您在指定
journal_mode = WAL
时与数据库进行了交互,然后尝试从不支持WAL
(〈v3.7.0)的客户端使用数据库,也会出现此错误。As noted in the SQLite documentation under Backwards Compatibility,要解决此问题而不必重新创建数据库,请将日志模式显式设置为
DELETE
:5w9g7ksd5#
您的数据库未加密(这只是错误消息中的两个选项之一)。
您的数据恢复工具没有恢复正确的数据;你在档案里找到的是别的东西。
必须从备份中还原数据库文件。
arknldoa6#
问题是与sqlcipher版本升级在我的情况下,每当我更新我的pod它自动升级sqlcipher和错误发生。
快速修复只需手动添加SDK而不是Pod安装。正确的解决方案请使用此链接GitHub Solution