从锁定的 SQLite3 数据库读取

Pie*_*ard 5 c sqlite objective-c

我正在查看第三方进程拥有的 SQLite 数据库。它看起来是锁定的并且有一个 *-journal 文件。我不知道的是,锁是共享的还是独占的。

我希望从数据库中读取,即使它当前被其他进程锁定。我只会从数据库中读取。

目前我失败了。只要第三方进程正在运行,我就会收到 SQLITE_BUSY 返回码。

我看过 sqlite3_busy_handler,但这似乎不是解决方案。据我了解,只允许实现重试机制。它似乎没有提供一种方法来忽略数据库已锁定的事实。

如何强制 SQLite 从该数据库中读取数据?

顺便说一句,我目前正在使用 FMDatabase API 包装器。这不使用 sqlite3_busy_handler。只要得到 SQLITE_BUSY 返回码,它就会无限循环。

Nat*_*ate 4

我一直在对此进行一些研究,看起来有一些(非常不受欢迎的)选择。

  • 杀死锁定数据库的进程

这可能不适合你,也不适合我。

  • 复制文件并读取副本

这似乎是解决这个问题的最佳方案。就我而言,我正在尝试读取 Firefox sqlite 数据库。Firefox 似乎会长时间锁定该文件,所以我不能只是等待。

由于您正在复制实时数据库文件,因此您可能会得到损坏的副本。我认为不存在损坏原件的风险(但我对此不确定)。

只需将文件复制到 shell 上即可,例如

copy original.sqlite copy.sqlite
Run Code Online (Sandbox Code Playgroud)

或者

cp  original.sqlite copy.sqlite
Run Code Online (Sandbox Code Playgroud)

然后就可以正常打开了。