/Importer/MySpotlightImporter.m

http://github.com/bububa/MongoHub-Mac · Objective C · 169 lines · 87 code · 46 blank · 36 comment · 13 complexity · b5dbb55e68f49626074ad4cf697b9edd MD5 · raw file

  1. //
  2. // MySpotlightImporter.m
  3. // MongoHub
  4. //
  5. // Created by Syd on 10-4-24.
  6. // Copyright MusicPeace.ORG 2010 . All rights reserved.
  7. //
  8. #import "MySpotlightImporter.h"
  9. #define YOUR_STORE_TYPE NSXMLStoreType
  10. @interface MySpotlightImporter ()
  11. @property (nonatomic, retain) NSURL *modelURL;
  12. @property (nonatomic, retain) NSURL *storeURL;
  13. @end
  14. @implementation MySpotlightImporter
  15. @synthesize modelURL, storeURL;
  16. - (BOOL)importFileAtPath:(NSString *)filePath attributes:(NSMutableDictionary *)spotlightData error:(NSError **)error {
  17. NSDictionary *pathInfo = [NSPersistentStoreCoordinator elementsDerivedFromExternalRecordURL:[NSURL fileURLWithPath:filePath]];
  18. self.modelURL = [NSURL fileURLWithPath:[pathInfo valueForKey:NSModelPathKey]];
  19. self.storeURL = [NSURL fileURLWithPath:[pathInfo valueForKey:NSStorePathKey]];
  20. NSURL *objectURI = [pathInfo valueForKey:NSObjectURIKey];
  21. NSManagedObjectID *oid = [[self persistentStoreCoordinator] managedObjectIDForURIRepresentation:objectURI];
  22. if (!oid) {
  23. NSLog(@"%@:%s to find object id from path %@", [self class], _cmd, filePath);
  24. return NO;
  25. }
  26. NSManagedObject *instance = [[self managedObjectContext] objectWithID:oid];
  27. // how you process each instance will depend on the entity that the instance belongs to
  28. if ([[[instance entity] name] isEqualToString:@"YOUR_ENTITY_NAME"]) {
  29. // set the display name for Spotlight search result
  30. NSString *yourDisplayString = [NSString stringWithFormat:@"YOUR_DISPLAY_STRING %@",[instance valueForKey:@"SOME_KEY"]];
  31. [spotlightData setObject: yourDisplayString forKey:(NSString *)kMDItemDisplayName];
  32. /*
  33. Determine how you want to store the instance information in 'spotlightData' dictionary.
  34. For each property, pick the key kMDItem... from MDItem.h that best fits its content.
  35. If appropriate, aggregate the values of multiple properties before setting them in the dictionary.
  36. For relationships, you may want to flatten values.
  37. id YOUR_FIELD_VALUE = [instance valueForKey: ATTRIBUTE_NAME];
  38. [spotlightData setObject: YOUR_FIELD_VALUE forKey: (NSString *) kMDItem...];
  39. ... more property values;
  40. To determine if a property should be indexed, call isIndexedBySpotlight
  41. */
  42. }
  43. return YES;
  44. }
  45. - (void)dealloc {
  46. [managedObjectContext release];
  47. [persistentStoreCoordinator release];
  48. [managedObjectModel release];
  49. [modelURL release];
  50. [storeURL release];
  51. [super dealloc];
  52. }
  53. /**
  54. Returns the managed object model.
  55. The last read model is cached in a global variable and reused
  56. if the URL and modification date are identical
  57. */
  58. static NSURL *cachedModelURL = nil;
  59. static NSManagedObjectModel *cachedModel = nil;
  60. static NSDate *cachedModelModificationDate =nil;
  61. - (NSManagedObjectModel *)managedObjectModel {
  62. if (managedObjectModel != nil) return managedObjectModel;
  63. NSDictionary *modelFileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[modelURL path] error:nil];
  64. NSDate *modelModificationDate = [modelFileAttributes objectForKey:NSFileModificationDate];
  65. if ([cachedModelURL isEqual:modelURL] && [modelModificationDate isEqualToDate:cachedModelModificationDate]) {
  66. managedObjectModel = [cachedModel retain];
  67. }
  68. if (!managedObjectModel) {
  69. managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
  70. if (!managedObjectModel) {
  71. NSLog(@"%@:%s unable to load model at URL %@", [self class], _cmd, modelURL);
  72. return nil;
  73. }
  74. // Clear out all custom classes used by the model to avoid having to link them
  75. // with the importer. Remove this code if you need to access your custom logic.
  76. NSString *managedObjectClassName = [NSManagedObject className];
  77. for (NSEntityDescription *entity in managedObjectModel) {
  78. [entity setManagedObjectClassName:managedObjectClassName];
  79. }
  80. // cache last loaded model
  81. [cachedModelURL release];
  82. cachedModelURL = [modelURL retain];
  83. [cachedModel release];
  84. cachedModel = [managedObjectModel retain];
  85. [cachedModelModificationDate release];
  86. cachedModelModificationDate = [modelModificationDate retain];
  87. }
  88. return managedObjectModel;
  89. }
  90. /**
  91. Returns the persistent store coordinator for the importer.
  92. */
  93. - (NSPersistentStoreCoordinator *) persistentStoreCoordinator {
  94. if (persistentStoreCoordinator) return persistentStoreCoordinator;
  95. NSError *error = nil;
  96. persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
  97. if (![persistentStoreCoordinator addPersistentStoreWithType:YOUR_STORE_TYPE
  98. configuration:nil
  99. URL:storeURL
  100. options:nil
  101. error:&error]){
  102. NSLog(@"%@:%s unable to add persistent store coordinator - %@", [self class], _cmd, error);
  103. }
  104. return persistentStoreCoordinator;
  105. }
  106. /**
  107. Returns the managed object context for the importer; already
  108. bound to the persistent store coordinator.
  109. */
  110. - (NSManagedObjectContext *) managedObjectContext {
  111. if (managedObjectContext) return managedObjectContext;
  112. NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
  113. if (!coordinator) {
  114. NSLog(@"%@:%s unable to get persistent store coordinator", [self class], _cmd);
  115. return nil;
  116. }
  117. managedObjectContext = [[NSManagedObjectContext alloc] init];
  118. [managedObjectContext setPersistentStoreCoordinator: coordinator];
  119. return managedObjectContext;
  120. }
  121. @end