2015-01-20 129 views
-2

我正在嘗試對Core Data存儲進行備份/恢復;在我的應用程序中,我創建了該文件,執行fileExistsAtPath並且該文件在那裏。當我使用Finder時,它不在那裏。這是代碼(我複製和修改,使風格和重複的命名是不是我或許應該從頭再來)創建備份:我使用NSPersistentStoreCoordinator創建了一個文件,但在應用程序重新啓動後未找到該文件

UPDATE的代碼是here ...

這是控制檯輸出:

CURRENTURL爲file:///用戶/ spokanedude /庫/開發商/ CoreSimulator /設備/ 1EE69744-255A-45CD-88F1-63FEAD117B32 /數據/集裝箱/數據/應用/ 41B5E165-C3E2-4D8A-81EB-98ADB20B8B0D/Documents/saori.sqlite 2015-01-20 10:41:36.042 SalonBook [84743:20 55509]

要使用的備份文件URL是file:/// Users/spokanedude/Library/Developer/CoreSimulator/Devices/1EE69744-255A-45CD-88F1-63FEAD117B32/data/Containers/Data/Application/41B5E165-C3E2 -4D8A-81EB-98ADB20B8B0D /文檔/ saori.backup-20153920103944

2015年1月20日10:41:36.042 SalonBook [84743:2055509]

currentCoreData存在 2015年1月20日10時41分: 36.042 SalonBook [84743:2055509]

備份文件存在 2015-01-20 10:41:36.042 SalonBook [84743:2055509]

目標文件存在 2015年1月20日10:41:36.092 SalonBook [84743:2055509]當前存儲器文件中刪除

2015年1月20日10:41:36.125 SalonBook [84743:2055509]替換當前存儲文件成功

二零一五年一月二十零日10:41:36.126 SalonBook [84743:2055509]商店選項是{ NSSQLitePragmasOption = { 「journal_mode」= WAL; }; } 2015年1月20日10:41:36.127 SalonBook [84743:2055509] addPersistentStoreWithType成功完成...

2015年1月20日10:41:36.127 SalonBook [84743:2055509] STORE文件是/用戶/spokanedude/Library/Developer/CoreSimulator/Devices/1EE69744-255A-45CD-88F1-63FEAD117B32/data/Containers/Data/Application/41B5E165-C3E2-4D8A-81EB-98ADB20B8B0D/Documents/saori.sqlite

當我做備份時,它說文件在那裏;當我使用ForkLift(Finder替換)時,它顯示(有時);當我執行還原時,它會找到該文件並說恢復成功,但是它會清除現有數據,如文件內容丟失。無法弄清楚我的生活......幫助將不勝感激。

+0

該控制檯輸出是不一樣的'NSLog'在您的代碼段調用你明白了什麼從運行代碼 – 2015-01-20 19:09:52

+0

我沒有把代碼彌補了休息礦石...有問題的控制檯輸出是從那裏...我討厭把這個數量的代碼... pastebin好嗎? – SpokaneDude 2015-01-20 19:11:52

+3

你應該包括任何與問題相關的代碼。控制檯輸出應該與問題中包含的代碼相匹配。 – 2015-01-20 19:13:49

回答

1

首先,檢查fileExistsAtPath:的文檔。您將看到以下警告:

不建議嘗試基於文件系統的當前狀態或文件系統上的特定文件來判斷行爲。這樣做會造成奇怪的行爲或競賽狀況。嘗試一個操作(例如加載文件或創建目錄),檢查錯誤並妥善處理這些錯誤要比試圖提前弄清操作是否成功要好得多。

這正是你在做什麼,並且你正在看到意外的行爲。

使用WAL模式時,最需要的數據是不是在「saori.sqlite」的文件,但在SQLite的將在同一目錄中放置其他文件。在使用WAL模式時,實際上不會寫入「saori.sqlite」文件。 Apple Technical QA 1809記錄了這一點,並且SQLite documentation中提供了更多詳細信息。

對於這樣那樣的原因,它通常是一個好主意,讓每個核心數據的SQLite儲存它自己的目錄。

如果您嘗試將「saori.sqlite」文件複製到新位置,並使用核心數據而不是將其打開,則其他存儲的文件將實際上爲空。你會去:(

不幸的是,你的恢復實施做了什麼,它需要備份「saori.sqlite」文件並將其複製到一個新的位置,而不用WAL模式使用的其他文件,然後添加一個新的使用該位置存儲 - 但WAL文件丟失,所以核心數據會創建新的數據,這會導致數據丟失 - 您的數據永遠不會移動,並且核心數據會創建新文件。

執行還原的推薦方法是隻是備份的相反:?使用遷移

+0

我想備份存儲在用戶的文檔目錄,因爲我認爲這是什麼建議。我只有一個CD存儲(saori.sqlite)......當我看着ForkLift中的目錄時,它們似乎在那裏,並且所有三個文件(saori.backup,shm和wal都在那裏)。我可以使用SQLite Professional打開備份文件,但這不是被恢復的! – SpokaneDude 2015-01-20 19:23:16

+0

「我可以使用SQLite Professional打開備份文件,但這不是恢復的內容!」你是什麼意思?什麼得到恢復?是否有數據(特別是關係)缺失? – quellish 2015-01-20 19:29:53

+0

SQLite Prof在文件複製之前或之後顯示它?我會建議使用像Core Dara Editor這樣的核心數據特定工具。 SQLite工具通常會顯示一個令人誤解的情況:您只能看到.sqlite文件中的少量內容,並認爲所有數據都在那裏,而實際上您需要的數據位於其他(缺少)文件中。以CoreData爲重點的工具不太可能存在相同的問題。 – quellish 2015-01-20 19:41:26

相關問題