2010-02-01 41 views
24

出於性能原因,我想爲我的一些實體設置索引屬性。我創建了一個新的核心數據模型版本來執行更改。核心數據檢測到更改並將我的模型遷移到新版本,但是,沒有索引產生通過遷移將核心數據索引添加到特定屬性

如果我從零開始重新創建數據庫,索引就在那裏。 我使用SQLite瀏覽器在iPhone和模擬器上進行了檢查。 只有先前格式的數據庫已經存在,纔會出現此問題。

有沒有辦法手動添加索引?寫一些SQL的呢?或者我錯過了什麼?我已經做了一些更重要的遷移,在那裏沒有問題。但是那些缺失的索引正在擾亂我。

感謝您的幫助!

+0

我可以建議接受斯科特的回答嗎?它工作,它很乾淨。 – 2011-07-14 13:28:45

+0

當然,完全忘了這一點。謝謝,文森特和thx爲斯科特的偉大答案! – steipete 2011-07-17 13:52:37

回答

50

我有同樣的問題。

按照Core Data Model Versioning and Data Migration Programming Guide

的版本 核心數據的角度來看,是影響 持續性,只有在模型的 功能感興趣。

因爲Core Data沒有看到您的兩個模型模式不同(索引不影響持久性),所以只需向現有模型屬性添加索引不會自動觸發遷移。

但是,您可以通過向新建索引屬性添加版本哈希修飾符來使Core Data查看您的模型。這觸發了輕量級遷移來更新我現有的數據庫。

+0

工程,謝謝,不明顯的數字:) – 2011-07-14 13:29:29

+14

太棒了。爲我解決了它。我對核心數據的緩慢和索引似乎沒有幫助感到瘋狂!對於任何不明白上述解決方案意味着什麼的人......創建一個新的模型版本,在屬性窗口的tick指標中點擊您希望添加索引的屬性,然後查看下面的「版本哈希修飾符」 ,只需輸入任何字符串,如「change1」。速度差異很大 – 2011-08-18 18:12:53

+0

將索引添加到屬性並輸入版本哈希修飾符後,如何檢查值是否已編入索引? – noRema 2012-10-17 11:21:41

0

您使用了哪種遷移策略?

在XCode中,您可以生成映射模型,並查看將發生的更改(包括索引)。

我建議只需添加映射模型,驗證更改指定的索引,並執行自動輕量級遷移:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,nil]; 
NSPersistentStore *migratedStore = [persistentStoreCoordinator addPersistentStoreWithType:nil configuration:nil URL:storeURL options:options error:&error]; 
migrationWasSuccessful = (migratedStore != nil); 

持久存儲協調器將自動發現映射模型,並用它來執行遷移。這聽起來像運行時推斷的模型對索引應用到實體屬性並不敏感。

+0

我忘了提及,這些選項已經在我的測試中啓用。我沒有測試它沒有這些,雖然... – steipete 2010-03-30 15:43:21