2011-10-06 80 views
0

目前,我有Spotlight-api代码搜索电子邮件的正文。我正在使用NSMetadataQuery并为"kMDItemTextContent like[c] %@"创建谓词。当请求的“搜索词”位于电子邮件正文中时,此工作正常。Mac Spotlight-API:如何搜索电子邮件的“至”,“来自”或“主题”字段

在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]; 

回答

1

我知道如何与MDQuery做到这一点 - 这在我看来是简单。

你可以使用基本上相同的查询,你可以在命令行中使用mdfind。

作出这样一个搜索字符串:(未测试)

((((kMDItemAuthorEmailAddresses == "*john*"cd)) || ((kMDItemAuthors == "*john*"cd))) && (kMDItemContentType == 'com.apple.mail.emlx')) 

也在终端 MDLS /path/to/library/mail/v2/24324.emlx 会显示什么搜索上的电子邮件。它是你的朋友

请注意如何连接目标c通知。

NSString* query = some string ; 

MDQueryRef mdQuery = MDQueryCreate(nil, (CFStringRef)query, nil, nil); 

// if something is goofy, we won't get the query back, and all calls involving a mil MDQuery crash. So return: 
if (mdQuery == nil) 
    return; 

NSNotificationCenter* nf = [NSNotificationCenter defaultCenter]; 
[nf addObserver:self selector:@selector(progressUpradeQuery:) name:(NSString*)kMDQueryProgressNotification object:(id) mdQuery]; 
[nf addObserver:self selector:@selector(finishedUpradeQuery:) name:(NSString*)kMDQueryDidFinishNotification object:(id) mdQuery]; 
[nf addObserver:self selector:@selector(updatedUpradeQuery:) name:(NSString*)kMDQueryDidUpdateNotification object:(id) mdQuery]; 

// Should I run this query on the network too? Difficult decision, as I think that this will slow stuff way down. 
// But i think it will only query leopard servers so perhaps ok 
//MDQuerySetSearchScope(mdQuery, (CFArrayRef)[NSArray arrayWithObjects:(NSString*)kMDQueryScopeComputer, (NSString*)kMDQueryScopeNetwork, nil], 0); 

// start it 
BOOL queryRunning = MDQueryExecute(mdQuery, kMDQueryWantsUpdates); 
if (!queryRunning) 
{ 
    CFRelease(mdQuery); 
    mdQuery = nil; 
    // leave this log message in... 
    NSLog(@"MDQuery failed to start."); 
    return; 
} 

汤姆

+0

我有'MDQueryExecute(mdQuery,kMDQueryWantsUpdates)的问题'所以我用'MDQueryExecute(mdQuery,kMDQuerySynchronous)',我得到想要的电子邮件 - 我的处理是在单独的线程反正。谢谢! –

相关问题