CocoaPods trunk is moving to be read-only. Read more on the blog, there are 14 months to go.
| TestsTested | ✓ | 
| LangLanguage | Obj-CObjective C | 
| License | MIT | 
| ReleasedLast Release | Dec 2014 | 
Maintained by .
Objective Record is a lightweight ActiveRecord way of managing Core Data objects. If you've used Ruby on Rails before, it might sound familiar.
No AppDelegate code required. It's fully tested with Kiwi.
#import "ObjectiveRecord.h" in your model or .pch file.Person *john = [Person create];
john.name = @"John";
[john save];
[john delete];
[Person create:@{ 
    @"name" : @"John",
    @"age" : @12, 
    @"member" : @NO 
}];// all Person entities from the database
NSArray *people = [Person all];
// Person entities with name John
NSArray *johns = [Person where:@"name == 'John'"];
// And of course, John Doe!
Person *johnDoe = [Person find:@"name == %@ AND surname == %@", @"John", @"Doe"];
// Members over 18 from NY
NSArray *people = [Person where:@{ 
                      @"age" : @18,
                      @"member" : @YES,
                      @"state" : @"NY"
                  }];
// You can even write your own NSPredicate
NSPredicate *membersPredicate = [NSPredicate  predicateWithBlock:^BOOL(Person *person, NSDictionary *bindings) {
    return person.isMember == YES;
}];
NSArray *members = [Person where:membersPredicate];// People by their last name ascending
NSArray *sortedPeople = [Person allWithOrder:@"surname"];
// People named John by their last name Z to A
NSArray *reversedPeople = [Person where:@{@"name" : @"John"} 
                                  order:@{@"surname" : @"DESC"}];
// You can use NSSortDescriptor too
NSArray *people = [Person allWithOrder:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]];
// And multiple orderings with any of the above
NSArray *morePeople = [Person allWithOrder:@"surname ASC, name DESC"];
// Just the first 5 people named John sorted by last name
NSArray *fivePeople = [Person where:@"name == 'John'"
                              order:@{@"surname" : @"ASC"}
                              limit:@(5)];// count all Person entities
NSUInteger personCount = [Person count];
// count people named John
NSUInteger johnCount = [Person countWhere:@"name == 'John'"];NSManagedObjectContext *newContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
newContext.persistentStoreCoordinator = [[CoreDataManager instance] persistentStoreCoordinator];
Person *john = [Person createInContext:newContext];
Person *john = [Person find:@"name == 'John'" inContext:newContext];
NSArray *people = [Person allInContext:newContext];If you've added the Core Data manually, you can change the custom model and database name on CoreDataManager
[CoreDataManager sharedManager].modelName = @"MyModelName";
[CoreDataManager sharedManager].databaseName = @"custom_database_name";// find
[[Person all] each:^(Person *person) {
    person.member = @NO;
}];
for(Person *person in [Person all]) {
    person.member = @YES;
}
// create / save
Person *john = [Person create];
john.name = @"John";
john.surname = @"Wayne";
[john save];
// find / delete
[[Person where: @{ @"member" : @NO }] each:^(Person *person) {
    [person delete];
}];The most of the time, your JSON web service returns keys like first_name, last_name, etc. 
Your ObjC implementation has camelCased properties - firstName, lastName.
Since v1.2, camel case is supported automatically - you don't have to do anything! Otherwise, if you have more complex mapping, here's how you do it:
// just override +mappings in your NSManagedObject subclass
// this method is called just once, so you don't have to do any caching / singletons
@implementation Person
+ (NSDictionary *)mappings {
  return @{ 
      @"id": @"remoteID",
      @"mmbr": @"isMember",
      // you can also map relationships, and initialize your graph from a single line
      @"employees": @{
          @"class": [Person class]
      },
      @"cars": @{
          @"key": @"vehicles",
          @"class": [Vehicle class]
      }
  };
  // first_name => firstName is automatically handled
}
@endObjectiveRecord supports CoreData's in-memory store. In any place, before your tests start running, it's enough to call
[[CoreDataManager sharedManager] useInMemoryStore];ObjectiveRecord is available under the MIT license. See the LICENSE file for more information.