何千ものレコードがある場合、メモリにロードせずにすべてのレコードのブール値フラグを更新することは可能ですか?
そうでない場合、sqlite に直接接続してこれを行うことは可能ですか?
私のモデルには、10000 レコードで更新する必要がある IsNew ブール値フラグがあるとします。これを行うためにすべてをメモリにロードしたくありません。
はい、できますが、一度ではできません。
毎回設定された数のアイテムをロードし(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)
バックグラウンドでこれを行い、変更をメイン コンテキストにマージすることをお勧めします。