DotMac

プログラムに関する覚え書き等

NSMetadataQuery

NSMetadataQuery seems to have bugs and unable to get NSMetadataQueryResultContentRelevanceAttribute value.


Use MDQueryRef instead.




#import <Cocoa/Cocoa.h>


@interface MyDocument : NSDocument

{

    IBOutlet id field;

MDQueryRef _query;

}

- (IBAction)search:(id)sender;

@end


---------


#import "MyDocument.h"



@implementation MyDocument


- (id)init

{

    self = [super init];

    if (self) {

     }

    return self;

}


- (NSString *)windowNibName

{

    return @"MyDocument";

}


- (void)windowControllerDidLoadNib:(NSWindowController *) aController

{

    [super windowControllerDidLoadNib:aController];

 

}



- (IBAction)search:(id)sender

{

if( [[field stringValue] isEqualToString:@"" ] ) return;

        NSString *predicateFormat = @"(kMDItemTextContent == \"?%@*\"c) && (kMDItemContentType != 'com.apple.mail.emlx') && (kMDItemContentType != 'public.vcard')";

_query = MDQueryCreate (

  NULL,

[NSString stringWithFormat:predicateFormat,[field stringValue]],

  [NSArray arrayWithObjects:kMDQueryResultContentRelevance,

  kMDItemPath, kMDItemDisplayName, kMDItemFSName,nil ],

  [NSArray arrayWithObject:kMDQueryResultContentRelevance]

  );

MDQuerySetSearchScope (

  _query,

  [NSArray arrayWithObject:kMDQueryScopeComputer ],

  0

  );


[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(finish) name:kMDQueryDidFinishNotification object:_query];



MDQueryExecute (

_query,

kMDQuerySynchronous

);



}



-(void)finish

{


[[NSNotificationCenter defaultCenter] removeObserver:self

name:nil

  object:_query];

MDItemRef miref;

CFIndex idx;

idx = MDQueryGetResultCount(_query);


CFIndex hoge;

for( hoge = 0; hoge < idx; hoge++ )

{

miref = MDQueryGetResultAtIndex( _query, hoge);


NSString* name = (NSString*)MDItemCopyAttribute (

miref,

kMDItemFSName

);

NSString* path = (NSString*)MDItemCopyAttribute (

miref,

kMDItemPath

);

NSString* displayname = (NSString*)MDItemCopyAttribute (

miref,

kMDItemDisplayName

);

NSNumber* score = (NSNumber*)MDQueryGetAttributeValueOfResultAtIndex (

  _query,

  kMDQueryResultContentRelevance,

  hoge

  );

if( score != nil )

NSLog(@"score %f",[score floatValue]);

}

}


@end



 

Parting Words (著作権, 連絡先情報, etc.)