【发布时间】:2011-12-02 05:55:17
【问题描述】:
目前我有搜索电子邮件正文的 Spotlight-api 代码。我正在使用NSMetadataQuery 并为"kMDItemTextContent like[c] %@" 创建谓词。当请求的“搜索词”在电子邮件正文中时,这可以正常工作。
在 Spotlight 应用程序(右上角的放大镜图标)中,如果我输入“to: john”,我将获得“to”字段包含单词“john”的电子邮件列表(例如,某些电子邮件地址的一部分 john@something。 com)。
我尝试通过添加"kMDItemRecipients"、"kMDItemRecipientEmailAddresses"、"kMDItemAuthors"、"kMDItemAuthorEmailAddresses" 和"kMDItemSubject" 类型的附加谓词来使用[NSCompoundPredicate orPredicateWithSubpredicates:] 实现此目的。
不幸的是,这不会返回所需的电子邮件。
有谁知道如何使用 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];
【问题讨论】:
标签: objective-c macos spotlight