您是否可以更新核心数据中的数千条记录而无需将其加载到内存中?

时间:2013-05-15 21:06:03

标签: macos cocoa core-data

如果我有数千条记录,是否可以更新所有记录的布尔标志而不将它们加载到内存中?

如果没有,是否可以直接连接到sqlite来执行此操作?

假设我的模型有一个IsNew布尔标志,我需要在10000条记录上更新,我不想将它们全部加载到内存中来执行此操作。

2 个答案:

答案 0 :(得分:0)

Core Data的默认持久性存储只是一个常规的SQLite数据库,所以直接连接到它并执行查询应该不会太难。我不确定您是否需要在执行此操作后“刷新”托管对象上下文,但您可能应该这样做。

在iPhone模拟器中,您通常应该在以下位置找到SQLite数据库:

/Users/<username>/Application Support/iPhone Simulator/<iOS version>/Applications/<GUID>/Documents

答案 1 :(得分:0)

是的,你可以,但不能一气呵成 只需每次加载一定数量的项目(N),更新它们,保存,获取下一批次。

在您的示例中,它应该类似于:

NSFetchRequest* request = [[NSFetchRequest alloc] initWithEntityName:@"YourEntity"];
[request setPredicate:[NSPredicate predicateWithFormat:@"isNew == YES"]];
[request setFetchLimit:100];
[request setIncludesPropertyValues:YES];
[request setReturnsObjectsAsFaults:NO];
NSArray* batch = nil;
do {
    batch = [context executeFetchRequest:request
                                   error:&error];
    if ([batch count]) {
        [batch setValue:@NO forKey:@"isNew"];
        if (![context save:&error]) {
            batch = nil;
        } else {
            [context reset]; //free memory
        }
    }
} while ([batch count] == batchSize);
//test for errors (batch == nil)

您可能希望在后台执行此操作并将更改合并到主上下文。