これは私を困惑させています:
次のコードを使用して検索/フィルタリングするコアデータセットがあります。
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Lead" inManagedObjectContext:moc]];
NSString *predicateString = [NSString stringWithFormat:@"("
"(isLocalVersion == %@) AND (LeadStatusID =='Active')"
") AND ("
"(LeadID contains[cd] '%@')"
"OR (AccountNumber contains[cd] '%@')"
"OR (ANY contactItems.FirstName contains[cd] '%@')"
"OR (ANY contactItems.LastName contains[cd] '%@')"
"OR (ANY addressItems.Address1 contains[cd] '%@')"
"OR (ANY addressItems.City contains[cd] '%@')"
")", [NSNumber numberWithBool:YES], sTerm, sTerm, sTerm, sTerm, sTerm, sTerm];
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
[fetchRequest setPredicate:predicate];
NSError *error = nil;
NSArray *leads = nil;
@try {
leads = [moc executeFetchRequest:fetchRequest error:&error];
}
@catch (NSException *exception) {
LogSevere(@"Error Executing Fetch Request: %@", exception);
leads = [NSArray array];
}
@finally {
[fetchRequest release];
}
sTermは単なるNSString
。です。
これは95%の確率で機能しますが、たまにNSInvalidArgumentException: Can't use in/contains operator with collection 10076173 (not a collection).
述語文字列の形式は次のとおりです。
((isLocalVersion == 1)AND(LeadStatusID =='Active'))AND((LeadID contains [cd]'i')OR(AccountNumber contains [cd]'i')OR(ANY contactItems.FirstName contains [cd] 'i')OR(ANY contactItems.LastName contains [cd]'i')OR(ANY addressItems.Address1 contains [cd]'i')OR(ANY addressItems.City contains [cd]'i'))
私のキャッチでは、クラッシュせずに0の結果を返すことができますが、これは最適ではありません。誰かがこれを見たことがありますか?
私の唯一の手がかりは、コアデータのレコードを変更(および保存)した後に発生するように見えることです(これも時々だけです)。