2013-09-25 84 views
5

我已經閱讀了關於ios7 SQLite/Core Data堆棧中新WAL默認設置的許多線程。帶有WAL的ios7 sqlite數據庫從不同步主數據庫文件

它看起來像一個好主意......雖然我需要執行一個數據庫副本到一個遙遠的webservice根據我的業務需求不時。目前我只備份SQLITE文件,而我無法將其他2個文件添加到我正在使用的web服務操作中。這意味着我的備份顯然不是最新的,因此毫無意義。

其他人建議我應該使用journal_mode = DELETE(NSSQLitePragmasOption)來禁用WAL,這對我來說是一個可以接受的解決方法。不過,我對此感到不舒服。這感覺就像我錯過了一個非常不錯的性能凹凸。

理想情況下,我希望能夠告訴Core Data/SQLite將SHM/WAL同步到主數據文件,然後執行備份。有沒有辦法這樣做,而不挖出瘋狂的私人或無證API?

+0

您有什麼解決方案嗎? – 2013-10-05 09:16:18

+0

我遇到同樣的問題。我從ios 6移動到ios 7,ios6似乎只有.sqlite文件來存儲數據。但是ios7有.shm和.wal文件。我使用fileWrapper將文件保存到單個文件。如果在iOS7中,我不禁用* .shm和* .wal,那麼iOS6不能使用備份在iOS7中的文件。 – JimZ

+0

我選擇了簡單選項(前一種默認模式)。我沒有找到一個好的解決方案。 –

回答

2

move the WAL data to the database file,打開數據庫文件並執行SQL語句PRAGMA wal_checkpoint(RESTART)

+0

你能舉個例子嗎?它看起來也需要數據庫?你可以從managedContext或其他東西嗎? –

+3

在使用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 
$