/Source/Categories/NSManagedObject+MagicalRecord.m

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