为啥添加单个实体后我的核心数据需要很长时间才能保存?

Posted

技术标签:

【中文标题】为啥添加单个实体后我的核心数据需要很长时间才能保存?【英文标题】:Why is my core data taking so long to save after adding a single entity?为什么添加单个实体后我的核心数据需要很长时间才能保存? 【发布时间】: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] 行大约需要一分钟?另外,您能否评论一下您正在做的事情的上下文 - 将托管对象从一个上下文复制到另一个上下文? 正确,该行大约需要一分钟。本质上,我正在复制它们。这是对大型数据库进行标准迁移的唯一方法。如果您通过自动映射来执行此操作,它会耗尽内存并在一定时间后被终止。所以我必须手动完成。 【参考方案1】:

[newContext save:&error];

在 for 循环之外。不需要每次都运行。

它会解决你的问题。

【讨论】:

【参考方案2】:

我同意将它放在循环之外不仅仅是为了执行目的(速度),而是因为如果循环中出现问题,你想要一半或你的数据保存,然后另一半不?大多数情况下,用户希望全部或全部都没有。否则您作为代码让她找出正确保存的条目和未正确保存的条目。

所以 1.. 执行时间 2. 出于管理目的

【讨论】:

以上是关于为啥添加单个实体后我的核心数据需要很长时间才能保存?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 azure 需要这么长时间才能创建 Windows 核心服务器容器实例?

为啥 train_test_split 需要很长时间才能运行?

迁移需要很长时间才能应用到数据库

需要很长时间才能打开的基于文档的核心数据应用程序的最佳实践

与 C 和 C++ 相比,为啥 c# 代码需要很长时间才能执行 [关闭]

为啥 popToRootViewContoller 会冻结或需要很长时间才能执行?