在我的應用程序中,我有時需要重建和重新填充數據庫文件。 SQLite數據庫由CoreData堆棧創建和管理。如何強制coredata重建sqlite數據庫模型?
我想要做的是放下文件,然後重新創建persistentStoreCoordinator對象。
它的工作原理在模擬器,但不是在設備上,在那裏我得到這樣的錯誤:
NSFilePath = "/var/mobile/Applications/936C6CC7-423A-46F4-ADC0-7184EAB0CADD/Documents/MYDB.sqlite";
NSUnderlyingException = I/O error for database at /var/mobile/Applications/936C6CC7-423A-46F4-ADC0-7184EAB0CADD/Documents/MYDB.sqlite. SQLite error code:1, 'table ZXXXX already exists';
我找不到這種以任何方式的原因。它表示兩個不同的問題 - 可可錯誤256表示該文件不存在或不可讀。但創建persistenStoreCoordinator後創建的文件IS儘管它是空的,但執行一些查詢後它消失。
表示嘗試創建已存在表的第二條消息在這種情況下很奇怪。
我很困惑,不明白這裏發生了什麼。我的代碼如下所示:
NSString *path = [[WLLocalService dataStorePath] relativePath];
NSError *error = nil;
WLLOG(@"About to remove file %@", path);
[[NSFileManager defaultManager] removeItemAtPath: path error: &error];
if (error != nil) {
WLLOG(@"Error removing the DB: %@", error);
}
[self persistentStoreCoordinator];
WLLOG(@"Rebuild DB result %d", [[NSFileManager defaultManager] fileExistsAtPath: path]);
執行此代碼後,DB文件存在但爲空。當第一次查詢(以及所有後續)被執行時,它會給我上面的錯誤並且文件消失。
有沒有人知道它有什麼問題?
非常感謝您指點正確的方式!
謝謝你的提示,這很有趣,我會嘗試一下。但是,在刪除文件之前發佈NSPersistentStoreCoordinator的所有實例時,是不是這樣?這就是在上面調用我的方法之前發生的事情。我猜想它會刪除並釋放所有後續的數據結構。你能否解釋爲什麼在刪除文件本身之前明確地從協調器中刪除持久存儲是非常重要的? – Burt 2010-03-02 08:18:05
所以我試過你的解決方案,它的工作原理!非常感謝!不過,我仍然想知道明確刪除持久性存儲和簡單釋放協調程序的區別在哪裏。 – Burt 2010-03-02 11:15:37
如果您在'NSManagedObjectContext'中將'NSPersistentStoreCoordinator'設置爲nil並釋放它,那麼您可能會完成同樣的事情,但這遠比指示'NSPersistentStoreCoordinator'去除存儲更重要。 – 2010-03-02 14:32:02