如果我有数千条记录,是否可以更新所有记录的布尔标志而不将它们加载到内存中?
如果没有,是否可以直接连接到sqlite来执行此操作?
假设我的模型有一个IsNew布尔标志,我需要在10000条记录上更新,我不想将它们全部加载到内存中来执行此操作。
答案 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)
您可能希望在后台执行此操作并将更改合并到主上下文。