2010-02-20 36 views
4

我正在查看由第三方進程擁有的SQLite數據庫。它看起來是鎖定的並且有一個* -journal文件。我不知道的是,如果鎖是共享的或排他性的。從鎖定的SQLite3數據庫中讀取

我希望從數據庫中讀取數據,即使它當前被其他進程鎖定。我只會從數據庫中讀取數據。

目前我在此失敗。只要第三方進程正在運行,我就會得到一個SQLITE_BUSY返回碼。

我看過sqlite3_busy_handler,但似乎並不是解決方案。據我所知,只允許實施一個重試機制。它似乎沒有提供一種方法來忽略數據庫被鎖定的事實。

如何強制SQLite從該數據庫讀取?

順便說一句,我目前使用FMDatabase API包裝。這不使用sqlite3_busy_handler。只要它獲得SQLITE_BUSY返回碼,它就會無休止地循環。

+0

你是怎麼打開數據庫的? – kennytm 2010-02-20 10:50:05

+0

int err = sqlite3_open(databasePath,&db); 還有其他方法嗎? – 2010-02-20 11:04:59

+0

您是否有任何方法可以告訴其他進程是否已停用或處於磁盤睡眠狀態(可能)?鎖定(AFAIK)應該僅用於寫入。 – 2010-02-20 11:35:41

回答

1

我一直在做這方面的一些研究,它看起來像有一些(非常不可取的)選項。

  • 殺死了數據庫進程鎖定

這可能不是一個選擇,這是不是對我也。

  • 複製文件並讀取複製

這似乎是解決這一問題的最佳解決方案。在我的情況下,我正在嘗試閱讀一個Firefox的sqlite數據庫。 Firefox似乎長時間鎖定文件,所以我不能等待。

由於您正在複製實時數據庫文件,因此可能會損壞副本。我不認爲有破壞原始文件的風險(但我不確定這一點)。

只需將文件的拷貝殼像

copy original.sqlite copy.sqlite 

cp original.sqlite copy.sqlite 

然後正常開放。

+0

對不起,我忘記了這個問題,最後我在閱讀之前克隆了Lightroom數據庫:https://github.com/karelia/iMedia/blob/master/IMBLightroom3Parser.m – 2013-03-08 10:58:00

+0

聽起來像你得出了同樣的結論。感謝您的更新。 – Nate 2013-03-08 16:43:54