【发布时间】:2012-09-17 16:48:15
【问题描述】:
我的核心数据代码太长了,所以我注释掉了大部分行,将其简化为:
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 行,那么保存根本不需要很长时间。但是有了这条线,保存大约需要一分钟。在此之前,数据存储中没有其他内容。为什么会发生这种情况?
【问题讨论】:
-
您的意思是
[newContext save:&error]行大约需要一分钟?另外,您能否评论一下您正在做的事情的上下文 - 将托管对象从一个上下文复制到另一个上下文? -
正确,该行大约需要一分钟。本质上,我正在复制它们。这是对大型数据库进行标准迁移的唯一方法。如果您通过自动映射来执行此操作,它会耗尽内存并在一定时间后被终止。所以我必须手动完成。
标签: iphone objective-c ios core-data nsmanagedobject