如何处理 BackupHelper 和 SQLites 附加文件
Posted
技术标签:
【中文标题】如何处理 BackupHelper 和 SQLites 附加文件【英文标题】:How handle BackupHelper and SQLites additional files 【发布时间】:2012-11-06 16:08:48 【问题描述】:我目前正在为我的 android 应用程序的数据库开发一个 BackupHelper。方法Context.databaseList()
报告属于我的应用程序的所有数据库的名称。但是除了主要的 SQLite 数据库文件(例如)之外,我确实遇到了很多其他文件:
所有 Android 文档都说明每个数据库只有一个数据库文件,但这些信息似乎已经过时了。
使用 BackupHelper 存储所有这些文件是否可以保存?
还原后 SQLite 是否可以在所有 Android 平台上使用这些文件?
非常感谢。
【问题讨论】:
【参考方案1】:做了一些谷歌搜索,发现了一些关于其他文件的信息:
database.db-journal
SQLite 默认在事务开始时创建日志文件,这是一件好事。通常它会在提交时删除文件。
您可以通过 PRAGMA sql 命令更改此行为以简单地截断文件(无需创建/删除)或将其归零。您的 SQLite 版本可能不支持所有选项。
PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | OFF
写入操作通常在您提交之前不会完成,这是通过截断、删除或使日志无效来实现的。
如果这种行为是新的,我无法解释为什么它可能会改变,除了可能是 SQLite 的升级改变了默认行为,或者通过不为每个事务重新打开日志而变得更加复杂。
Source
database.db-shm 数据库.db-wal
这些是 SQLite 创建的临时文件。如果您手动删除主数据库,您可能也应该删除这些。据我所知,WAL 是回滚日志的替代品,它使 SQLite 能够在事务失败时回滚更改。 SQLite 如何使用它们以及为什么它们存在这么长时间取决于 SQLite 的作者,但总的来说 SQLite 看起来非常坚如磐石,所以我不会太担心它们。欲了解更多信息,请查看此处:
http://www.sqlite.org/fileformat2.html#walindexformat
这些文件是 SQLite 3.7 的新特性。
Source
希望对您有所帮助...
【讨论】:
谢谢。所以保存备份所有模式为“database.db*”的文件并在以后恢复它们? 我没有做过类似的事情,所以我很确定,但看起来它们是用于未提交更改和回滚的临时文件,因此您可以避免备份这些文件。我建议尝试仅备份.db
文件,看看是否可以仅使用此文件恢复数据库...
至少需要wal文件。几个月前我曾与一位客户进行过测试,因为他无法看到备份数据库中的所有条目。我们发现 wal 不是传统的日志文件。相反,它仅将提交的(!!!)条目附加到 wal 文件,并且仅在达到阈值/检查点时才将它们传输到主文件。我想我会备份我找到的所有东西......以上是关于如何处理 BackupHelper 和 SQLites 附加文件的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 UIDeviceOrientationFaceUp 和 UIDeviceOrientationFaceDown?