我的核心数据代码花了太长时间,所以我评论了大部分内容,将其简化为:
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"CoreDataStore.sqlite"];
NSString *backupSourceStorePath = [[self applicationDocumentsDirectory]
stringByAppendingPathComponent:@"CoreDataStoreBackup.sqlite"];
NSManagedObjectContext *oldContext = [self version1ManagedObjectContext];
TICDSSynchronizedManagedObjectContext *newContext = [self managedObjectContext];
NSFetchRequest *oldFetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *oldEntryEntity = [NSEntityDescription entityForName:@"Entry"
inManagedObjectContext:oldContext];
[oldFetchRequest setEntity:oldEntryEntity];
int numberOfEntries = [oldContext countForFetchRequest:oldFetchRequest error:nil];
int batchSize = 10;
[oldFetchRequest setFetchLimit:batchSize];
int offset = 0;
while (numberOfEntries - offset > 0) {
[oldFetchRequest setFetchOffset:offset];
NSError *error;
NSArray *entries = [oldContext executeFetchRequest:oldFetchRequest error:&error];
int i = 0;
for (NSManagedObject *entry in entries) {
Entry *newEntry = [NSEntityDescription insertNewObjectForEntityForName:@"Entry"
inManagedObjectContext:newContext];
i++;
NSLog(@"i: %i", i);
}
[newContext save:&error];
NSLog(@"Save error: %@", error);
offset = offset + batchSize;
}
如果我没有insertNewObjectForEntityForName
行,那么保存不需要很长时间。但有了这条线,节省大约需要一分钟。在此之前,数据存储中没有其他任何内容。有什么理由可能会发生这种情况?
答案 0 :(得分:0)
放
[newContext save:&error];
外面的循环。每次都不需要运行。
它会解决您的问题。
答案 1 :(得分:0)
我同意将它放在循环之外,不仅仅是出于执行目的(速度),而是因为如果循环中出现问题,你想要保存一半或你的数据然后另一半不是吗?大多数时候用户都期望全部或者没有。另外,作为代码,她要确定哪些条目正确保存,哪些条目没有保存。
所以1 ..执行时间 2.出于可管理性目的