/Source/Categories/NSManagedObject+MagicalRecord.m

https://github.com/zipmark/MagicalRecord · Objective C · 675 lines · 536 code · 135 blank · 4 comment · 10 complexity · 49ac8d21db871e1ceee3e7fa1a8968e9 MD5 · raw file

  1. // Created by Saul Mora on 11/15/09.
  2. // Copyright 2010 Magical Panda Software, LLC All rights reserved.
  3. //
  4. //#import "NSManagedObject+MagicalRecord.h"
  5. #import "CoreData+MagicalRecord.h"
  6. static NSUInteger defaultBatchSize = kMagicalRecordDefaultBatchSize;
  7. @implementation NSManagedObject (MagicalRecord)
  8. + (void) setDefaultBatchSize:(NSUInteger)newBatchSize
  9. {
  10. @synchronized(self)
  11. {
  12. defaultBatchSize = newBatchSize;
  13. }
  14. }
  15. + (NSUInteger) defaultBatchSize
  16. {
  17. return defaultBatchSize;
  18. }
  19. + (NSArray *) executeFetchRequest:(NSFetchRequest *)request inContext:(NSManagedObjectContext *)context
  20. {
  21. NSError *error = nil;
  22. NSArray *results = [context executeFetchRequest:request error:&error];
  23. [MagicalRecordHelpers handleErrors:error];
  24. return results;
  25. }
  26. + (NSArray *) executeFetchRequest:(NSFetchRequest *)request
  27. {
  28. return [self executeFetchRequest:request inContext:[NSManagedObjectContext contextForCurrentThread]];
  29. }
  30. + (id) executeFetchRequestAndReturnFirstObject:(NSFetchRequest *)request inContext:(NSManagedObjectContext *)context
  31. {
  32. [request setFetchLimit:1];
  33. NSArray *results = [self executeFetchRequest:request inContext:context];
  34. if ([results count] == 0)
  35. {
  36. return nil;
  37. }
  38. return [results objectAtIndex:0];
  39. }
  40. + (id) executeFetchRequestAndReturnFirstObject:(NSFetchRequest *)request
  41. {
  42. return [self executeFetchRequestAndReturnFirstObject:request inContext:[NSManagedObjectContext contextForCurrentThread]];
  43. }
  44. #if TARGET_OS_IPHONE
  45. + (void) performFetch:(NSFetchedResultsController *)controller
  46. {
  47. NSError *error = nil;
  48. if (![controller performFetch:&error])
  49. {
  50. [MagicalRecordHelpers handleErrors:error];
  51. }
  52. }
  53. #endif
  54. + (NSEntityDescription *)entityDescriptionInContext:(NSManagedObjectContext *)context
  55. {
  56. if ([self respondsToSelector:@selector(entityInManagedObjectContext:)])
  57. {
  58. NSEntityDescription *entity = [self performSelector:@selector(entityInManagedObjectContext:) withObject:context];
  59. return entity;
  60. }
  61. else
  62. {
  63. NSString *entityName = NSStringFromClass([self class]);
  64. return [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
  65. }
  66. }
  67. + (NSEntityDescription *)entityDescription
  68. {
  69. return [self entityDescriptionInContext:[NSManagedObjectContext contextForCurrentThread]];
  70. }
  71. + (NSArray *)propertiesNamed:(NSArray *)properties
  72. {
  73. NSEntityDescription *description = [self entityDescription];
  74. NSMutableArray *propertiesWanted = [NSMutableArray array];
  75. if (properties)
  76. {
  77. NSDictionary *propDict = [description propertiesByName];
  78. for (NSString *propertyName in properties)
  79. {
  80. NSPropertyDescription *property = [propDict objectForKey:propertyName];
  81. if (property)
  82. {
  83. [propertiesWanted addObject:property];
  84. }
  85. else
  86. {
  87. ARLog(@"Property '%@' not found in %@ properties for %@", propertyName, [propDict count], NSStringFromClass(self));
  88. }
  89. }
  90. }
  91. return propertiesWanted;
  92. }
  93. + (NSArray *) sortAscending:(BOOL)ascending attributes:(NSArray *)attributesToSortBy
  94. {
  95. NSMutableArray *attributes = [NSMutableArray array];
  96. for (NSString *attributeName in attributesToSortBy)
  97. {
  98. NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:attributeName ascending:ascending] autorelease];
  99. [attributes addObject:sortDescriptor];
  100. }
  101. return attributes;
  102. }
  103. + (NSArray *) ascendingSortDescriptors:(NSArray *)attributesToSortBy
  104. {
  105. return [self sortAscending:YES attributes:attributesToSortBy];
  106. }
  107. + (NSArray *) descendingSortDescriptors:(NSArray *)attributesToSortBy
  108. {
  109. return [self sortAscending:NO attributes:attributesToSortBy];
  110. }
  111. + (NSFetchRequest *)createFetchRequestInContext:(NSManagedObjectContext *)context
  112. {
  113. NSFetchRequest *request = [[NSFetchRequest alloc] init];
  114. [request setEntity:[self entityDescriptionInContext:context]];
  115. return [request autorelease];
  116. }
  117. + (NSFetchRequest *)createFetchRequest
  118. {
  119. return [self createFetchRequestInContext:[NSManagedObjectContext contextForCurrentThread]];
  120. }
  121. #pragma mark -
  122. #pragma mark Number of Entities
  123. + (NSNumber *) numberOfEntitiesWithContext:(NSManagedObjectContext *)context
  124. {
  125. return [NSNumber numberWithUnsignedInteger:[self countOfEntitiesWithContext:context]];
  126. }
  127. + (NSNumber *)numberOfEntities
  128. {
  129. return [self numberOfEntitiesWithContext:[NSManagedObjectContext contextForCurrentThread]];
  130. }
  131. + (NSNumber *) numberOfEntitiesWithPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)context
  132. {
  133. return [NSNumber numberWithUnsignedInteger:[self countOfEntitiesWithPredicate:searchTerm inContext:context]];
  134. }
  135. + (NSNumber *) numberOfEntitiesWithPredicate:(NSPredicate *)searchTerm;
  136. {
  137. return [self numberOfEntitiesWithPredicate:searchTerm
  138. inContext:[NSManagedObjectContext contextForCurrentThread]];
  139. }
  140. + (NSUInteger) countOfEntities;
  141. {
  142. return [self countOfEntitiesWithContext:[NSManagedObjectContext contextForCurrentThread]];
  143. }
  144. + (NSUInteger) countOfEntitiesWithContext:(NSManagedObjectContext *)context;
  145. {
  146. NSError *error = nil;
  147. NSUInteger count = [context countForFetchRequest:[self createFetchRequestInContext:context] error:&error];
  148. [MagicalRecordHelpers handleErrors:error];
  149. return count;
  150. }
  151. + (NSUInteger) countOfEntitiesWithPredicate:(NSPredicate *)searchFilter;
  152. {
  153. return [self countOfEntitiesWithPredicate:searchFilter inContext:[NSManagedObjectContext defaultContext]];
  154. }
  155. + (NSUInteger) countOfEntitiesWithPredicate:(NSPredicate *)searchFilter inContext:(NSManagedObjectContext *)context;
  156. {
  157. NSError *error = nil;
  158. NSFetchRequest *request = [self createFetchRequestInContext:context];
  159. [request setPredicate:searchFilter];
  160. NSUInteger count = [context countForFetchRequest:request error:&error];
  161. [MagicalRecordHelpers handleErrors:error];
  162. return count;
  163. }
  164. + (BOOL) hasAtLeastOneEntity
  165. {
  166. return [self hasAtLeastOneEntityInContext:[NSManagedObjectContext contextForCurrentThread]];
  167. }
  168. + (BOOL) hasAtLeastOneEntityInContext:(NSManagedObjectContext *)context
  169. {
  170. return [[self numberOfEntitiesWithContext:context] intValue] > 0;
  171. }
  172. #pragma mark -
  173. #pragma mark Reqest Helpers
  174. + (NSFetchRequest *) requestAll
  175. {
  176. return [self createFetchRequestInContext:[NSManagedObjectContext contextForCurrentThread]];
  177. }
  178. + (NSFetchRequest *) requestAllInContext:(NSManagedObjectContext *)context
  179. {
  180. return [self createFetchRequestInContext:context];
  181. }
  182. + (NSFetchRequest *) requestAllWithPredicate:(NSPredicate *)searchTerm;
  183. {
  184. return [self requestAllWithPredicate:searchTerm inContext:[NSManagedObjectContext contextForCurrentThread]];
  185. }
  186. + (NSFetchRequest *) requestAllWithPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)context;
  187. {
  188. NSFetchRequest *request = [self createFetchRequestInContext:context];
  189. [request setPredicate:searchTerm];
  190. return request;
  191. }
  192. + (NSFetchRequest *) requestAllWhere:(NSString *)property isEqualTo:(id)value
  193. {
  194. return [self requestAllWhere:property isEqualTo:value inContext:[NSManagedObjectContext contextForCurrentThread]];
  195. }
  196. + (NSFetchRequest *) requestAllWhere:(NSString *)property isEqualTo:(id)value inContext:(NSManagedObjectContext *)context
  197. {
  198. NSFetchRequest *request = [self createFetchRequestInContext:context];
  199. [request setPredicate:[NSPredicate predicateWithFormat:@"%K = %@", property, value]];
  200. return request;
  201. }
  202. + (NSFetchRequest *) requestFirstWithPredicate:(NSPredicate *)searchTerm
  203. {
  204. return [self requestFirstWithPredicate:searchTerm inContext:[NSManagedObjectContext contextForCurrentThread]];
  205. }
  206. + (NSFetchRequest *) requestFirstWithPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)context
  207. {
  208. NSFetchRequest *request = [self createFetchRequestInContext:context];
  209. [request setPredicate:searchTerm];
  210. [request setFetchLimit:1];
  211. return request;
  212. }
  213. + (NSFetchRequest *) requestFirstByAttribute:(NSString *)attribute withValue:(id)searchValue;
  214. {
  215. return [self requestFirstByAttribute:attribute withValue:searchValue inContext:[NSManagedObjectContext contextForCurrentThread]];
  216. }
  217. + (NSFetchRequest *) requestFirstByAttribute:(NSString *)attribute withValue:(id)searchValue inContext:(NSManagedObjectContext *)context;
  218. {
  219. NSFetchRequest *request = [self createFetchRequestInContext:context];
  220. [request setFetchLimit:1];
  221. [request setPropertiesToFetch:[NSArray arrayWithObject:attribute]];
  222. [request setPredicate:[NSPredicate predicateWithFormat:@"%K = %@", attribute, searchValue]];
  223. return request;
  224. }
  225. + (NSFetchRequest *) requestAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending inContext:(NSManagedObjectContext *)context
  226. {
  227. NSFetchRequest *request = [self requestAllInContext:context];
  228. NSSortDescriptor *sortBy = [[[NSSortDescriptor alloc] initWithKey:sortTerm ascending:ascending] autorelease];
  229. [request setSortDescriptors:[NSArray arrayWithObject:sortBy]];
  230. return request;
  231. }
  232. + (NSFetchRequest *) requestAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending
  233. {
  234. return [self requestAllSortedBy:sortTerm
  235. ascending:ascending
  236. inContext:[NSManagedObjectContext contextForCurrentThread]];
  237. }
  238. + (NSFetchRequest *) requestAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending withPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)context
  239. {
  240. NSFetchRequest *request = [self requestAllInContext:context];
  241. [request setPredicate:searchTerm];
  242. [request setIncludesSubentities:NO];
  243. [request setFetchBatchSize:[self defaultBatchSize]];
  244. NSSortDescriptor *sortBy = [[[NSSortDescriptor alloc] initWithKey:sortTerm ascending:ascending] autorelease];
  245. [request setSortDescriptors:[NSArray arrayWithObject:sortBy]];
  246. return request;
  247. }
  248. + (NSFetchRequest *) requestAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending withPredicate:(NSPredicate *)searchTerm;
  249. {
  250. NSFetchRequest *request = [self requestAllSortedBy:sortTerm
  251. ascending:ascending
  252. withPredicate:searchTerm
  253. inContext:[NSManagedObjectContext contextForCurrentThread]];
  254. return request;
  255. }
  256. #pragma mark Finding Data
  257. #pragma mark -
  258. + (NSArray *)findAllInContext:(NSManagedObjectContext *)context
  259. {
  260. return [self executeFetchRequest:[self requestAllInContext:context] inContext:context];
  261. }
  262. + (NSArray *)findAll
  263. {
  264. return [self findAllInContext:[NSManagedObjectContext contextForCurrentThread]];
  265. }
  266. + (NSArray *)findAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending inContext:(NSManagedObjectContext *)context
  267. {
  268. NSFetchRequest *request = [self requestAllSortedBy:sortTerm ascending:ascending inContext:context];
  269. return [self executeFetchRequest:request inContext:context];
  270. }
  271. + (NSArray *)findAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending
  272. {
  273. return [self findAllSortedBy:sortTerm
  274. ascending:ascending
  275. inContext:[NSManagedObjectContext contextForCurrentThread]];
  276. }
  277. + (NSArray *)findAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending withPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)context
  278. {
  279. NSFetchRequest *request = [self requestAllSortedBy:sortTerm
  280. ascending:ascending
  281. withPredicate:searchTerm
  282. inContext:context];
  283. return [self executeFetchRequest:request inContext:context];
  284. }
  285. + (NSArray *)findAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending withPredicate:(NSPredicate *)searchTerm
  286. {
  287. return [self findAllSortedBy:sortTerm
  288. ascending:ascending
  289. withPredicate:searchTerm
  290. inContext:[NSManagedObjectContext contextForCurrentThread]];
  291. }
  292. #pragma mark -
  293. #pragma mark NSFetchedResultsController helpers
  294. #if TARGET_OS_IPHONE
  295. + (NSFetchedResultsController *) fetchRequestAllGroupedBy:(NSString *)group withPredicate:(NSPredicate *)searchTerm sortedBy:(NSString *)sortTerm ascending:(BOOL)ascending inContext:(NSManagedObjectContext *)context
  296. {
  297. NSString *cacheName = nil;
  298. #ifdef STORE_USE_CACHE
  299. cacheName = [NSString stringWithFormat:@"MagicalRecord-Cache-%@", NSStringFromClass(self)];
  300. #endif
  301. NSFetchRequest *request = [self requestAllSortedBy:sortTerm
  302. ascending:ascending
  303. withPredicate:searchTerm
  304. inContext:context];
  305. NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] initWithFetchRequest:request
  306. managedObjectContext:context
  307. sectionNameKeyPath:group
  308. cacheName:cacheName];
  309. return [controller autorelease];
  310. }
  311. + (NSFetchedResultsController *) fetchRequestAllGroupedBy:(NSString *)group withPredicate:(NSPredicate *)searchTerm sortedBy:(NSString *)sortTerm ascending:(BOOL)ascending
  312. {
  313. return [self fetchRequestAllGroupedBy:group
  314. withPredicate:searchTerm
  315. sortedBy:sortTerm
  316. ascending:ascending
  317. inContext:[NSManagedObjectContext contextForCurrentThread]];
  318. }
  319. + (NSFetchedResultsController *) fetchAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending withPredicate:(NSPredicate *)searchTerm groupBy:(NSString *)groupingKeyPath inContext:(NSManagedObjectContext *)context
  320. {
  321. NSFetchedResultsController *controller = [self fetchRequestAllGroupedBy:groupingKeyPath
  322. withPredicate:searchTerm
  323. sortedBy:sortTerm
  324. ascending:ascending
  325. inContext:context];
  326. [self performFetch:controller];
  327. return controller;
  328. }
  329. + (NSFetchedResultsController *) fetchAllSortedBy:(NSString *)sortTerm ascending:(BOOL)ascending withPredicate:(NSPredicate *)searchTerm groupBy:(NSString *)groupingKeyPath
  330. {
  331. return [self fetchAllSortedBy:sortTerm
  332. ascending:ascending
  333. withPredicate:searchTerm
  334. groupBy:groupingKeyPath
  335. inContext:[NSManagedObjectContext contextForCurrentThread]];
  336. }
  337. + (NSFetchedResultsController *) fetchRequest:(NSFetchRequest *)request groupedBy:(NSString *)group inContext:(NSManagedObjectContext *)context
  338. {
  339. NSString *cacheName = nil;
  340. #ifdef STORE_USE_CACHE
  341. cacheName = [NSString stringWithFormat:@"MagicalRecord-Cache-%@", NSStringFromClass([self class])];
  342. #endif
  343. NSFetchedResultsController *controller =
  344. [[NSFetchedResultsController alloc] initWithFetchRequest:request
  345. managedObjectContext:context
  346. sectionNameKeyPath:group
  347. cacheName:cacheName];
  348. [self performFetch:controller];
  349. return [controller autorelease];
  350. }
  351. + (NSFetchedResultsController *) fetchRequest:(NSFetchRequest *)request groupedBy:(NSString *)group
  352. {
  353. return [self fetchRequest:request
  354. groupedBy:group
  355. inContext:[NSManagedObjectContext contextForCurrentThread]];
  356. }
  357. #endif
  358. #pragma mark -
  359. + (NSArray *)findAllWithPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)context
  360. {
  361. NSFetchRequest *request = [self createFetchRequestInContext:context];
  362. [request setPredicate:searchTerm];
  363. return [self executeFetchRequest:request
  364. inContext:context];
  365. }
  366. + (NSArray *)findAllWithPredicate:(NSPredicate *)searchTerm
  367. {
  368. return [self findAllWithPredicate:searchTerm
  369. inContext:[NSManagedObjectContext contextForCurrentThread]];
  370. }
  371. + (id)findFirstInContext:(NSManagedObjectContext *)context
  372. {
  373. NSFetchRequest *request = [self createFetchRequestInContext:context];
  374. return [self executeFetchRequestAndReturnFirstObject:request inContext:context];
  375. }
  376. + (id)findFirst
  377. {
  378. return [self findFirstInContext:[NSManagedObjectContext contextForCurrentThread]];
  379. }
  380. + (id)findFirstByAttribute:(NSString *)attribute withValue:(id)searchValue inContext:(NSManagedObjectContext *)context
  381. {
  382. NSFetchRequest *request = [self requestFirstByAttribute:attribute withValue:searchValue inContext:context];
  383. [request setPropertiesToFetch:[NSArray arrayWithObject:attribute]];
  384. return [self executeFetchRequestAndReturnFirstObject:request inContext:context];
  385. }
  386. + (id)findFirstByAttribute:(NSString *)attribute withValue:(id)searchValue
  387. {
  388. return [self findFirstByAttribute:attribute
  389. withValue:searchValue
  390. inContext:[NSManagedObjectContext contextForCurrentThread]];
  391. }
  392. + (id)findFirstWithPredicate:(NSPredicate *)searchTerm
  393. {
  394. return [self findFirstWithPredicate:searchTerm inContext:[NSManagedObjectContext contextForCurrentThread]];
  395. }
  396. + (id)findFirstWithPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)context
  397. {
  398. NSFetchRequest *request = [self requestFirstWithPredicate:searchTerm inContext:context];
  399. return [self executeFetchRequestAndReturnFirstObject:request inContext:context];
  400. }
  401. + (id)findFirstWithPredicate:(NSPredicate *)searchterm sortedBy:(NSString *)property ascending:(BOOL)ascending inContext:(NSManagedObjectContext *)context
  402. {
  403. NSFetchRequest *request = [self requestAllSortedBy:property ascending:ascending withPredicate:searchterm inContext:context];
  404. return [self executeFetchRequestAndReturnFirstObject:request inContext:context];
  405. }
  406. + (id)findFirstWithPredicate:(NSPredicate *)searchterm sortedBy:(NSString *)property ascending:(BOOL)ascending
  407. {
  408. return [self findFirstWithPredicate:searchterm
  409. sortedBy:property
  410. ascending:ascending
  411. inContext:[NSManagedObjectContext contextForCurrentThread]];
  412. }
  413. + (id)findFirstWithPredicate:(NSPredicate *)searchTerm andRetrieveAttributes:(NSArray *)attributes inContext:(NSManagedObjectContext *)context
  414. {
  415. NSFetchRequest *request = [self createFetchRequestInContext:context];
  416. [request setPredicate:searchTerm];
  417. [request setPropertiesToFetch:attributes];
  418. return [self executeFetchRequestAndReturnFirstObject:request inContext:context];
  419. }
  420. + (id)findFirstWithPredicate:(NSPredicate *)searchTerm andRetrieveAttributes:(NSArray *)attributes
  421. {
  422. return [self findFirstWithPredicate:searchTerm
  423. andRetrieveAttributes:attributes
  424. inContext:[NSManagedObjectContext contextForCurrentThread]];
  425. }
  426. + (id) findFirstWithPredicate:(NSPredicate *)searchTerm sortedBy:(NSString *)sortBy ascending:(BOOL)ascending inContext:(NSManagedObjectContext *)context andRetrieveAttributes:(id)attributes, ...
  427. {
  428. NSFetchRequest *request = [self requestAllSortedBy:sortBy
  429. ascending:ascending
  430. withPredicate:searchTerm
  431. inContext:context];
  432. [request setPropertiesToFetch:[self propertiesNamed:attributes]];
  433. return [self executeFetchRequestAndReturnFirstObject:request inContext:context];
  434. }
  435. + (id) findFirstWithPredicate:(NSPredicate *)searchTerm sortedBy:(NSString *)sortBy ascending:(BOOL)ascending andRetrieveAttributes:(id)attributes, ...
  436. {
  437. return [self findFirstWithPredicate:searchTerm
  438. sortedBy:sortBy
  439. ascending:ascending
  440. inContext:[NSManagedObjectContext contextForCurrentThread]
  441. andRetrieveAttributes:attributes];
  442. }
  443. + (NSArray *)findByAttribute:(NSString *)attribute withValue:(id)searchValue inContext:(NSManagedObjectContext *)context
  444. {
  445. NSFetchRequest *request = [self createFetchRequestInContext:context];
  446. [request setPredicate:[NSPredicate predicateWithFormat:@"%K = %@", attribute, searchValue]];
  447. return [self executeFetchRequest:request inContext:context];
  448. }
  449. + (NSArray *)findByAttribute:(NSString *)attribute withValue:(id)searchValue
  450. {
  451. return [self findByAttribute:attribute
  452. withValue:searchValue
  453. inContext:[NSManagedObjectContext contextForCurrentThread]];
  454. }
  455. + (NSArray *)findByAttribute:(NSString *)attribute withValue:(id)searchValue andOrderBy:(NSString *)sortTerm ascending:(BOOL)ascending inContext:(NSManagedObjectContext *)context
  456. {
  457. NSPredicate *searchTerm = [NSPredicate predicateWithFormat:@"%K = %@", attribute, searchValue];
  458. NSFetchRequest *request = [self requestAllSortedBy:sortTerm ascending:ascending withPredicate:searchTerm inContext:context];
  459. return [self executeFetchRequest:request];
  460. }
  461. + (NSArray *)findByAttribute:(NSString *)attribute withValue:(id)searchValue andOrderBy:(NSString *)sortTerm ascending:(BOOL)ascending
  462. {
  463. return [self findByAttribute:attribute
  464. withValue:searchValue
  465. andOrderBy:sortTerm
  466. ascending:ascending
  467. inContext:[NSManagedObjectContext contextForCurrentThread]];
  468. }
  469. + (id) createInContext:(NSManagedObjectContext *)context
  470. {
  471. if ([self respondsToSelector:@selector(insertInManagedObjectContext:)])
  472. {
  473. id entity = [self performSelector:@selector(insertInManagedObjectContext:) withObject:context];
  474. return entity;
  475. }
  476. else
  477. {
  478. NSString *entityName = NSStringFromClass([self class]);
  479. return [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context];
  480. }
  481. }
  482. + (id)createEntity
  483. {
  484. NSManagedObject *newEntity = [self createInContext:[NSManagedObjectContext contextForCurrentThread]];
  485. return newEntity;
  486. }
  487. - (BOOL) deleteInContext:(NSManagedObjectContext *)context
  488. {
  489. [context deleteObject:self];
  490. return YES;
  491. }
  492. - (BOOL) deleteEntity
  493. {
  494. [self deleteInContext:[self managedObjectContext]];
  495. return YES;
  496. }
  497. + (BOOL) truncateAllInContext:(NSManagedObjectContext *)context
  498. {
  499. NSArray *allEntities = [self findAllInContext:context];
  500. for (NSManagedObject *obj in allEntities)
  501. {
  502. [obj deleteInContext:context];
  503. }
  504. return YES;
  505. }
  506. + (BOOL) truncateAll
  507. {
  508. [self truncateAllInContext:[NSManagedObjectContext contextForCurrentThread]];
  509. return YES;
  510. }
  511. - (NSNumber *)maxValueFor:(NSString *)property
  512. {
  513. NSManagedObject *obj = [[self class] findFirstByAttribute:property
  514. withValue:[NSString stringWithFormat:@"max(%@)", property]];
  515. return [obj valueForKey:property];
  516. }
  517. - (id) objectWithMinValueFor:(NSString *)property inContext:(NSManagedObjectContext *)context
  518. {
  519. NSFetchRequest *request = [[self class] createFetchRequestInContext:context];
  520. NSPredicate *searchFor = [NSPredicate predicateWithFormat:@"SELF = %@ AND %K = min(%@)", self, property, property];
  521. [request setPredicate:searchFor];
  522. return [[self class] executeFetchRequestAndReturnFirstObject:request inContext:context];
  523. }
  524. - (id) objectWithMinValueFor:(NSString *)property
  525. {
  526. return [self objectWithMinValueFor:property inContext:[self managedObjectContext]];
  527. }
  528. - (id) inContext:(NSManagedObjectContext*)context
  529. {
  530. NSError *error = nil;
  531. NSManagedObject *inContext = [context existingObjectWithID:[self objectID] error:&error];
  532. [MagicalRecordHelpers handleErrors:error];
  533. return inContext;
  534. }
  535. - (id) inThreadContext
  536. {
  537. NSManagedObject *weakSelf = self;
  538. return [weakSelf inContext:[NSManagedObjectContext contextForCurrentThread]];
  539. }
  540. @end