На данный момент у меня есть код Spotlight-API, который ищет тело письма. Я использую NSMetadataQuery
и создаю предикат для "kMDItemTextContent like[c] %@"
. Это прекрасно работает, когда запрошенный «критерий поиска» находится в теле письма.
В приложении Spotlight (значок лупы в правом верхнем углу), если я введу «to: john», я получу список электронных писем, в которых поле «to» содержит слово «john» (например, часть какого-либо адреса электронной почты john @ кое-что). ком).
Я попытался добиться этого с помощью [NSCompoundPredicate orPredicateWithSubpredicates:]
, добавив дополнительные предикаты типа "kMDItemRecipients"
, "kMDItemRecipientEmailAddresses"
, "kMDItemAuthors"
, "kMDItemAuthorEmailAddresses"
и "kMDItemSubject"
.
К сожалению, это не возвращает желаемые электронные письма.
Кто-нибудь знает, как этого добиться с помощью Spotlight-API?
Ниже мой код для этого:
NSString *predicateFormat = @"kMDItemTextContent like[c] %@";
NSPredicate *predicateToRun = [NSPredicate predicateWithFormat:predicateFormat, self.searchKey];
NSString *predicateFormat1 = @"kMDItemTitle like[c] %@";
NSPredicate *predicateToRun1 = [NSPredicate predicateWithFormat:predicateFormat1, self.searchKey];
NSString *predicateFormat2 = @"kMDItemAuthorEmailAddresses like[c] %@";
NSPredicate *predicateToRun2 = [NSPredicate predicateWithFormat:predicateFormat2, self.searchKey];
NSString *predicateFormat3 = @"kMDItemAuthors like[c] %@";
NSPredicate *predicateToRun3 = [NSPredicate predicateWithFormat:predicateFormat3, self.searchKey];
NSString *predicateFormat4 = @"kMDItemRecipientEmailAddresses like[c] %@";
NSPredicate *predicateToRun4 = [NSPredicate predicateWithFormat:predicateFormat4, self.searchKey];
NSString *predicateFormat5 = @"kMDItemRecipients like[c] %@";
NSPredicate *predicateToRun5 = [NSPredicate predicateWithFormat:predicateFormat5, self.searchKey];
NSString *predicateFormat6 = @"kMDItemSubject like[c] %@";
NSPredicate *predicateToRun6 = [NSPredicate predicateWithFormat:predicateFormat6, self.searchKey];
NSUInteger options = (NSCaseInsensitivePredicateOption|NSDiacriticInsensitivePredicateOption);
NSPredicate *compPred = [NSComparisonPredicate
predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"*"]
rightExpression:[NSExpression expressionForConstantValue:self.searchKey]
modifier:NSDirectPredicateModifier
type:NSLikePredicateOperatorType
options:options];
predicateToRun = [NSCompoundPredicate orPredicateWithSubpredicates:
[NSArray arrayWithObjects:
compPred,
predicateToRun, predicateToRun1, predicateToRun2, predicateToRun3, predicateToRun4,
predicateToRun5, predicateToRun6, nil]];
predicateToRun = [NSCompoundPredicate andPredicateWithSubpredicates:
[NSArray arrayWithObjects:predicateToRun, [NSPredicate predicateWithFormat:@"(kMDItemContentType != 'public.vcard')"], nil]];
[self.query setPredicate:predicateToRun];
[self.query startQuery];