如何在Core Data迁移后保持数据排序?

时间:2016-11-16 06:23:53

标签: objective-c iphone swift xcode core-data

在当前项目中,我有一组使用Core Data存储的对象。 现在我需要向DataModel添加一个字段。

我添加了它,创建了新的映射模型,将其设置为当前并成功迁移到新数据模型。一切正常,但......我的数据顺序丢失了。 出于一些奇怪的原因,以前的开发人员不会为数据模型创建任何订单属性,并且在获取数据时会自动排序(通过id我相信..)

使用映射模型迁移到新数据模型后,我在每次迁移后都会对数据进行随机排序。 现在,一些与此数据顺序相关的应用程序逻辑已被破坏。

如何解决此问题? 可以根据旧ID创建订单属性吗? 或者我如何使用ID进行迁移?

已经花了一天时间解决了这个问题并且找不到解决方案。

非常感谢! 亚历克斯。

请求检索数据代码:

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];

2 个答案:

答案 0 :(得分:0)

最简单的方法是不依赖于某些内部排序。当您访问数据时,向获取请求添加排序描述符。

另外,为了确保按顺序处理排序结果,请使用旧式循环for (int i = 0; i < array.count; i++)而不是枚举器for (id a in array)

答案 1 :(得分: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; }

然后我只是在我的视图中对项目进行排序。