2016-11-16 150 views
0

在當前項目中,我有一組使用Core Data存儲的對象。 現在我需要添加一個字段到DataModel。如何在覈心數據遷移後保持數據排序?

我已經添加了它,創建了新的映射模型,將其設置爲當前併成功遷移到新的數據模型。一切正常,但是..我的數據順序丟失了。 由於一些奇怪的原因,以前的開發人員不會創建任何訂單屬性到數據模型,並且它在獲取數據時被自動排序(通過ID我相信..)

使用映射模型遷移到新的數據模型後,在每次遷移後我的數據。 現在有些與這個數據的順序有關的應用程序邏輯被破壞了。

如何解決此問題? 可以根據舊ID創建訂單屬性嗎? 或者我可以如何使用ID遷移?

已經花了一天這個問題,並沒有找到解決方案。

非常感謝! Alex。

請求檢索數據的代碼:

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Area" inManagedObjectContext:[self context]]; 

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entityDescription]; 

NSError *error; 
return [[[self context] executeFetchRequest:request error:&error] mutableCopy]; 
+0

你可以發佈你如何檢索數據的代碼? – jjatie

+0

@jjatie sure,將其添加到問題文本 –

+0

您沒有提供'NSSortDescriptor'或'NSPredicate'來限制和排序結果。您需要執行此操作來爲您提供'managedObjectContext'排序結果。 – jjatie

回答

0

終於想出瞭如何解決這個問題。

我試圖創建自定義策略,發現數據傳遞給它正確的順序(就像是存儲在CoreData遷移之前) 這裏是如何創建自定義策略:Core Data versioning and migrating with custom policy

在此之後事情變得更簡單了。我創建了sortOrder字段,併爲自定義策略中的每個實體增加它,並將其設置爲我實體的新字段sortOrder

謝謝大家的幫助。

下面是代碼:

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error { 
MyEntity* myEntity = (MyEntity*)[NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]]; 

myEntity.myProp1 = [sInstance valueForKey:@"myProp1"]; 
//a lot of properties here.. 
//here is the solution - set sortOrder. Is is the property of custom policy class - one instance of this class is used for each entity migration 
area.sortOrder = sortOrder; 
int value = [sortOrder intValue]; 
sortOrder = [NSNumber numberWithInteger:value + 1]; 

[manager associateSourceInstance:sInstance withDestinationInstance:myEntity forEntityMapping:mapping]; 

return YES; } 

然後,我只是排序我的視圖中的項目。

0

最簡單的方法是不依靠一些內部排序。在訪問數據時將排序描述符添加到提取請求中。

另外要確保您的排序結果按順序處理,請使用舊式循環for (int i = 0; i < array.count; i++)而不是枚舉器for (id a in array)

+0

使用枚舉器。你枚舉了一個有序集合,枚舉按照這個順序繼續進行,對於一個NSArray來說,這意味着第一遍將用於索引0的對象,第二次用於索引1的對象等。「。 – Willeke

+0

謝謝弗拉基米爾!我已經嘗試過用老式的「for」循環的解決方案,並且數據的順序依然不正確。我之所以無法通過某些屬性對項目進行排序 - 我沒有這個屬性,當然,我可以添加它,但是我需要爲以前的用戶保留數據訂單,並試圖找出它是如何實現的。 –

+0

@Willeke關鍵詞是「ordered」。我絕對不確定使用枚舉器NSArray是按順序掃描的。東東d來處理數組中的每個元素,但是當順序很關鍵時,我更喜歡使用「舊」循環 - 不要依賴編譯器。 –