在当前项目中,我有一组使用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];
答案 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; }
然后我只是在我的视图中对项目进行排序。