Skip to content
This repository was archived by the owner on Sep 12, 2018. It is now read-only.

Repository files navigation

ObjectiveRecord CocoaPodBuild Status

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.

Usage

  1. Install with CocoaPods or clone
  2. #import "ObjectiveRecord.h" in your model or .pch file.

Create / Save / Delete

Person *john = [Person create];
john.name = @"John";
[john save];
[john delete];
[Person create:@{ @"name" : @"John",
@"age" : @12, @"member" : @NO }];

Finders

// all Person entities from the databaseNSArray *people = [Person all];
// Person entities with name JohnNSArray *johns = [Person where:@"name == 'John'"];
// And of course, John Doe!
Person *johnDoe = [Person find:@"name == %@ AND surname == %@", @"John", @"Doe"];
// Members over 18 from NYNSArray *people = [Person where:@{ @"age" : @18,
@"member" : @YES,
@"state" : @"NY"
}];
// You can even write your own NSPredicateNSPredicate *predicate = [NSPredicatepredicateWithFormat:@"(name like[cd] %@) AND (birthday > %@)",
name, birthday];
NSArray *results = [Person where:predicate];

Order and Limit

// People by their last name ascendingNSArray *sortedPeople = [Person allWithOrder:@"surname"];
// People named John by their last name Z to ANSArray *reversedPeople = [Person where:@{@"name" : @"John"} order:@{@"surname" : @"DESC"}];
// You can use NSSortDescriptor tooNSArray *people = [Person allWithOrder:[NSSortDescriptorsortDescriptorWithKey:@"name"ascending:YES]];
// And multiple orderings with any of the aboveNSArray *morePeople = [Person allWithOrder:@"surname ASC, name DESC"];
// Just the first 5 people named John sorted by last nameNSArray *fivePeople = [Person where:@"name == 'John'"order:@{@"surname" : @"ASC"}
limit:@(5)];

Aggregation

// count all Person entitiesNSUInteger personCount = [Person count];
// count people named JohnNSUInteger johnCount = [Person countWhere:@"name == 'John'"];

Custom ManagedObjectContext

NSManagedObjectContext *newContext = [[NSManagedObjectContextalloc] 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];

Custom CoreData model or .sqlite database

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";

Examples

// 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];
}];

Mapping

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@implementationPerson
+ (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
}
@end

Testing

ObjectiveRecord supports CoreData's in-memory store. In any place, before your tests start running, it's enough to call

[[CoreDataManager sharedManager] useInMemoryStore];

Roadmap

  • NSIncrementalStore support

License

ObjectiveRecord is available under the MIT license. See the LICENSE file for more information.

About

ActiveRecord-like API for CoreData

Resources

Stars

1.3k stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages