0

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

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

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

4

2 回答 2

0

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

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

/Users/<username>/Application Support/iPhone Simulator/<iOS version>/Applications/<GUID>/Documents
于 2013-05-16T03:48:18.167 回答
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)

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

于 2013-05-16T06:26:06.097 回答