問題は、setPropertiesToFetch: と setReturnsObjectsAsFaults:NO を使用しても、関係を設定すると、sqlite3 データベースで 2 つの追加の「select ...」が発生することです。
タスクとジョブモデルがあり、それらの間に関係があります。タスクには 1 つのジョブと job_id があり、ジョブには 1 つのタスクがあります。多くのタスクとジョブをインポートしています。プロセスを高速化するために、関係を設定する前にすべてのタスクとジョブをインポートします。インポートは正常に機能します。関係を設定すると、予期しないことが起こります。次のコードを使用して関係を設定します。
int limit = 100;
NSManagedObjectContext *moc = [appDelegate newMoc];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Task" inManagedObjectContext:moc]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"job = nil"]];
[fetchRequest setReturnsObjectsAsFaults:NO];
[fetchRequest setReturnsDistinctResults:YES];
[fetchRequest setFetchLimit:limit];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"job", @"job_id", nil]];
[fetchRequest setShouldRefreshRefetchedObjects:NO];
[fetchRequest setIncludesSubentities:NO];
while (true) {
@autoreleasepool {
NSError *error = nil;
NSArray *tasks = [moc executeFetchRequest:fetchRequest error:&error];
if (!error) {
if (tasks.count > 0) {
NSMutableSet *jobIDs = [[NSMutableSet alloc] init];
for (Task *task in tasks) {
[jobIDs addObject:task.job_id];
}
NSArray *jobs = [ListObjectsManager objectsForIDs:jobIDs properties:[NSArray arrayWithObjects:@"baseObjectID", @"task", nil] entityName:JobClassName moc:moc];
[jobIDs release];
for (Task *task in tasks) {
for (Job *job in jobs) {
if (task.job_id.intValue == job.baseObjectID.intValue) {
task.job = job;
job.task = task;
break;
}
}
}
[appDelegate saveContext:moc];
}
else {
//No more relationships to set
break;
}
}
else {
NSLog(@"ERROR FETCHING : %@", error.localizedDescription);
}
}
}
[fetchRequest release];
行task.job = jobは 2 つの新しい "select ..." を作成します!?!
これにより、避けたい多くの選択が生成されます。
添加
NSArray *tasks = [moc executeFetchRequest:fetchRequest error:&error];
「SELECT t0.Z_ENT, t0.Z_PK, t0.ZJOB, t0.ZJOB_ID FROM ZTASK t0 WHERE t0.ZJOB IS NULL LIMIT 100」を作成します。これは期待どおりに機能します。
NSLog(@"%d", [tasks objectAtIndex:0].job_id.intValue);
期待どおりに機能する新しい「選択...」は作成されません。
[tasks objectAtIndex:0].job_id = [NSNumber numberWithInt:63];
作成します:
2013-05-10 00:26:59.048[1197:1803] CoreData: sql: SELECT 0、t0.Z_PK、t0.Z_OPT、t0.ZBASEOBJECTID、t0.ZBASEOBJECTNAME、t0.ZJOB_DESCRIPTION、t0.ZJOB_ID、t0.ZJOB FROM ZTASK t0 WHERE t0.Z_PK = ? 2013-05-10 00:26:59.058[1197:1803] CoreData: 注釈: SQL 接続フェッチ時間: 0.0099 秒 2013-05-10 00:26:59.061[1197:1803] CoreData: 注釈: 合計フェッチ実行時間: 1 行で 0.0133 秒。2013-05-10 00:26:59.064[1197:1803] CoreData: 注釈: データベースから障害が発生しました: 0x1f540670
プロパティが設定されているときにエラーが発生するのはなぜですか?どうすればそれを回避できますか?
ありがとうございます!