2011-09-24 72 views
1

我有什麼似乎是OS X 10.7.1中的核心數據的錯誤。核心NSPersistenceFrameworkVersions 251和358之間的數據遷移失敗

我的數據存儲(NSSQLiteStoreType)未被正確自動遷移。

作爲一個側面說明,iOS版本的應用程序使用完全相同的Core Data模型。

- >這是看來正在發生的事情。

直到最新發布的一切都已經工作正常 -

我有模型的14個版本 - 模型13已經推出了無事相當長的一段時間。

最近我更新了我的應用程序,並添加了一個新的模型,所以我在14(這是現在在運輸應用程序中使用的版本)。

當從模型13遷移到14時,iOS版本工作得很好 - 所以不需要擔心。

因此而不是談論OS X版本讓使用NSPersistenceFrameworkVersions

NSPersistenceFrameworkVersions 251是10.6.8和NSPersistenceFrameworkVersions 358是10.7.1

如果我們使用像版本 - 這意味着模型13版251和遷移模型14版本251它工作正常。如果我們用模型13版358並遷移到模型14版本

也是如此358也能正常工作

這裏是它變得有趣

如果我們遷移模型13版358模型14版251它仍然能正常

但是從模型13版251遷移到14版型358確實工作

CoreData:錯誤:(1)I/O爲d錯誤atabase at blah。 SQLite的錯誤代碼:1,'沒有這樣的列:FOK_REFLEXIVE'

這隻會發生在從10.6.8(NSPersistenceFrameworkVersions 251)到10.7.1(NSPersistenceFrameworkVersions 358)時,所有其他排列都可以正常工作。

這裏是用於遷移的選項,它被傳遞給addPersistentStoreWithType。

// Allow inferred migration from the original version of the application. 
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 

最後一點,如果我們只將屬性添加到模型14的轉換將突破出現。只有增加一個會導致它破裂的實體。

其他人看到這類問題。 -提前致謝。

+1

我一直在使用iOS 5核心數據測試版遇到類似問題。我已經能夠通過刪除該項目並重新創建它來解決此問題,但無法保存所有數據。 – Jason

+0

@Jason - 您是否找到了解決方案 - 丟失數據對我來說不是一個真正的選擇! :) – deanWombourne

+1

我真的黑了核心數據,所以如果表沒有列,我通過直接SQLite操作手動添加它。它不漂亮,但它完美的作品。 – Jason

回答

0

此錯誤似乎已在iOS 5.1和OSX 10.7.3中修復了

+0

請展開一些示例,演示,文檔鏈接。 – QED

0

爲了澄清, 使用unix sqlite3工具,並將數據庫文件的路徑作爲參數。 您可以通過從應用程序下面的組織器設備窗格中將設備拉出應用程序的db文件...您將獲得一個包。

類型「.headers」在表頭的

查找表(.tables命令)的實體對象

哪裏Z_1REFERENCEDSETOFOBJECTS是你的表的名稱之間的引用。

select * from Z_1REFERENCEDSETOFOBJECTS limit 2 

查找表頭的名稱;然後對具有REFLEXIVE列的表執行以下操作:

ALTER TABLE Z_1REFERENCEDSETOFOBJECTS ADD FOK_REFLEXIVE integer 

將其推回。