【问题标题】:How do you determine if an .sqlite or .sqback is corrupt in Java?如何确定 .sqlite 或 .sqback 在 Java 中是否损坏?
【发布时间】:2012-09-07 06:27:48
【问题描述】:

我得到了一个目录目录,每个目录都包含我必须解析的 .sqlite 和 .sqback 文件的集合。

问题是我相信其中一些文件在我收到这些文件时已损坏,因为我收到以下错误: ERR: [SQLITE_CORRUPT] The database disk image is malformed (database disk image is malformed) 当我尝试处理它们时,在我的控制台上。这只发生在某些文件上。我已经隔离了一些并尝试在这些坏文件的新副本上单独运行我的程序,它们会导致错误。不过大部分文件都很好:)

我意识到我确实有可能一开始就收到损坏的文件,所以我想在尝试解析它们之前确定哪些文件是好的,哪些不是。

我正在用 Java 编写。我只对 sqlite 和 sqback 验证感兴趣,因为我知道我的解析器可以工作。我正在从以前的项目中重用它。

提示?建议?答案?

非常感谢您的知识转移。

【问题讨论】:

  • 我可能刚刚回答了我自己的问题,也可能没有:sqlite.org/faq.html#q21
  • 不幸的是,这实际上并没有像我希望的那样帮助我。我不确定我知道如何使用它。仍然很想听听您的想法!
  • 是的,很抱歉没有说得更清楚。我不太确定如何使用 PRAGMA quick_check。具体来说,如何以我可以获得一个值的方式使用它,该值允许我确定数据库是否已损坏。一旦我得到一个值,我该怎么比较它?谢谢。

标签: java android sqlite corruption


【解决方案1】:

像普通 SQL 查询一样运行 PRAGMA quick_check。结果与包含字符串的单列表相同;对于完整的数据库,您会看到一行“ok”,对于损坏的数据库,您会看到一堆错误消息。

sqlite> pragma quick_check;
ok

更改文件中的一些字节后:

sqlite> pragma quick_check;
*** in database main ***
Page 64: btreeInitPage() returns error code 11
On tree page 40 cell 23: Child page depth differs
On tree page 40 cell 24: Child page depth differs

不保证会发现错误。

【讨论】:

  • 非常感谢,CL。这就像一个魅力。我刚刚将它集成到我的 java 代码中,我很高兴!!!!
  • 在继续使用之前请注意this answer - 确实不能保证会/不会发现错误。
【解决方案2】:

我会并且确实会使用

pragma integrity_check

此编译指示对整个数据库进行完整性检查。这 完整性检查杂注查找乱序记录、丢失页面、 格式错误的记录、缺少索引条目以及 UNIQUE、CHECK 和 NOT NULL 约束错误。如果完整性检查杂注发现问题, 返回字符串(作为多行,每行一列) 其中描述了问题。 Pragma integrity_check 将返回 分析退出前出现最多 N 个错误,N 默认为 100。如果 pragma integrity_check 未发现错误,单行的值为 返回“确定”。 (ref)

为什么这比pragma quick_check好?

pragma 类似于完整性检查,只是它不验证 UNIQUE 约束,也不验证索引内容是否与表内容匹配。 (ref)

换句话说,pragma integrity_check 更彻底。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2011-02-15
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多