如果我有数千条记录,是否可以更新所有记录上的布尔标志而不将它们加载到内存中?
如果没有,是否可以直接连接到 sqlite 来执行此操作?
假设我的模型有一个 IsNew 布尔标志,我需要更新 10000 条记录,我不想将它们全部加载到内存中来执行此操作。
Core Data 的默认持久化存储只是一个常规的 SQLite 数据库,因此直接连接到它并执行查询应该不会太难。我不确定您是否需要在执行此操作后“刷新”托管对象上下文,但您可能应该这样做。
在 iPhone 模拟器中,您通常应该在以下位置找到 SQLite 数据库:
/Users/<username>/Application Support/iPhone Simulator/<iOS version>/Applications/<GUID>/Documents
是的,你可以,但不是一次性的。
每次只需加载一组项目(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)
您可能希望在后台执行此操作并将更改合并到主要上下文中。