【问题标题】:ios7 sqlite database with WAL never syncs the main database file带有 WAL 的 ios7 sqlite 数据库从不同步主数据库文件
【发布时间】:2013-10-01 07:31:55
【问题描述】:

我已经阅读了很多关于 ios7 SQLite / Core Data 堆栈中新的 WAL 默认设置的帖子。

首先,这看起来是个好主意……尽管我需要根据我的业务需要不时将数据库复制到远程 Web 服务。目前我只备份 SQLITE 文件,无法将另外 2 个文件添加到我正在使用的 web 服务操作中。这意味着我的备份显然不是最新的,因此毫无意义。

其他人建议我应该使用 journal_mode=DELETE (NSSQLitePragmasOption) 禁用 WAL,这对我来说是一种可以接受的解决方法。不过,我对此感到不舒服。感觉就像我错过了一个相当不错的性能提升。

理想情况下,我希望能够告诉 Core Data / SQLite 将 SHM/WAL 同步到主数据文件,然后执行备份。有没有办法在不挖掘疯狂的私有或无证 API 的情况下做到这一点?

【问题讨论】:

  • 你有什么解决办法吗?
  • 我遇到了同样的问题。我正在从 ios 6 迁移到 ios 7,ios6 似乎只有 .sqlite 文件来存储数据。但是 ios7 有 .shm 和 .wal 文件。我使用 fileWrapper 将文件保存到单个文件中。如果在 iOS7 中我没有禁用 *.shm 和 *.wal,那么 iOS6 就不能使用在 iOS7 中备份的文件
  • 我选择了简单的选项(以前的默认模式)。我没有找到好的解决方案。

标签: sqlite core-data ios7 shared-memory wal


【解决方案1】:

move the WAL data to the database file,打开数据库文件,执行SQL语句PRAGMA wal_checkpoint(RESTART)

【讨论】:

  • 你能举个例子吗?看起来它也需要数据库?你能从 managedContext 或其他东西中得到它吗?
  • 在使用 Core Data 时直接与 SQLite 对话绝不是一个好主意。为了您自己的利益,您应该为此使用 Objective C 方法。
【解决方案2】:
$ sqlite3 yourFile.sqlite
SQLite version 3.7.12 2012-04-03 19:43:07
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> PRAGMA wal_checkpoint(RESTART);
0|20|20
sqlite> .exit
$ 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    相关资源
    最近更新 更多