HobjectiveRecord
HobjectiveRecord is inspired by ObjectiveRecord and customized for background NSManagedObjectContext
.
Before you use, i recommend you read these articles
You can use HobjectiveRecord with swift. check HobjectiveRecordDemo-Swift. or use SobjectiveRecord written in swift
Usage
- copy all files in folder
HobjectiveRecord
to your project.
or Install with CocoaPodspod 'HobjectiveRecord'
#import "HobjectiveRecord.h"
in your code or .pch file.
Initialize
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// before you use CoreData stack, you should setup default store.
[NSPersistentStoreCoordinator setupDefaultStore];
// your code here
return YES;
}
/*
+ (void)setupDefaultStore;
+ (void)setupDefaultStoreWithModelURL:(NSURL *)modelURL storeURL:(NSURL *)storeURL useInMemoryStore:(BOOL)useInMemoryStore;
*/
Basic
use performBlock:
[[NSManagedObjectContext defaultContext] performBlock:^{
// your code here
}];
NSManagedObjectContext *childContext = [[NSManagedObjectContext defaultContext] createChildContext];
[childContext performBlock:^{
// your code here
}];
Create / Save / Delete
[[NSManagedObjectContext defaultContext] performBlock:^{
Tweet *tweet = [Tweet create];
tweet.text = @"I am here";
[tweet save];
[tweet delete];
tweet = [Tweet create:@{@"text" : @"hello!!",
@"lang" : @"en"} ];
[tweet save];
[Tweet deleteAll];
}];
/*
+ (instancetype)create;
+ (instancetype)create:(NSDictionary *)attributes;
+ (void)deleteAll;
+ (void)deleteWithCondition:(id)condition;
- (void)save;
- (void)saveToParent;
- (void)delete;
*/
Finders
[[NSManagedObjectContext defaultContext] performBlock:^{
NSArray *tweets = [Tweet all];
NSArray *tweetsInEnglish = [Tweet find:@"lang == 'en'"];
User *hmhv = [User first:@"screenName == 'hmhv'"];
NSArray *englishMen = [User find:@{@"lang" : @"en",
@"timeZone" : @"London"
}];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"friendsCount > 100"];
NSArray *manyFriendsUsers = [User find:predicate];
}];
/*
+ (NSArray *)all;
+ (NSArray *)find:(id)condition;
+ (instancetype)first:(id)condition;
+ (instancetype)firstOrCreate:(NSDictionary *)condition;
*/
Order and Limit
[[NSManagedObjectContext defaultContext] performBlock:^{
NSArray *sortedUsers = [User allWithOrder:@"name"];
NSArray *allUsers = [User allWithOrder:@"screenName ASC, name DESC"];
// or
NSArray *allUsers2 = [User allWithOrder:@"screenName A, name D"];
// or
NSArray *allUsers3 = [User allWithOrder:@"screenName, name d"];
NSArray *manyFriendsUsers = [User find:@"friendsCount > 100" order:@"screenName DESC"];
NSArray *fiveEnglishUsers = [User find:@"lang == 'en'" order:@"screenName ASC" limit:@(5)];
}];
/*
+ (NSArray *)allWithOrder:(NSString *)order;
+ (NSArray *)find:(id)condition order:(NSString *)order;
+ (NSArray *)find:(id)condition limit:(NSNumber *)limit;
+ (NSArray *)find:(id)condition order:(NSString *)order limit:(NSNumber *)limit;
*/
Aggregation
[[NSManagedObjectContext defaultContext] performBlock:^{
NSUInteger allUserCount = [User count];
NSUInteger englishUserCount = [User countWithCondition:@"lang == 'en'"];
}];
/*
+ (NSUInteger)count;
+ (NSUInteger)countWithCondition:(id)condition;
*/
BatchUpdate
[[NSManagedObjectContext defaultContext] performBlock:^{
[User batchUpdateWithCondition:@"friendsCount > 10" propertiesToUpdate:@{@"friendsCount": @0}];
// update all entities
[User batchUpdateWithCondition:nil propertiesToUpdate:@{@"friendsCount": @100}];
}];
/*
+ (NSUInteger)batchUpdateWithCondition:(id)condition propertiesToUpdate:(NSDictionary *)propertiesToUpdate;
+ (NSUInteger)batchUpdateWithCondition:(id)condition propertiesToUpdate:(NSDictionary *)propertiesToUpdate inContext:(NSManagedObjectContext *)context;
*/
NSFetchedResultsController
[[NSManagedObjectContext defaultContext] performBlock:^{
NSFetchedResultsController *frc = [User createFetchedResultsControllerWithCondition:nil order:@"name" sectionNameKeyPath:nil];
frc.delegate = self;
NSError *error = nil;
if ([frc performFetch:&error]) {
[self reloadData];
}
}
}];
/*
+ (NSFetchedResultsController *)createFetchedResultsControllerWithCondition:(id)condition order:(NSString *)order sectionNameKeyPath:(NSString *)sectionNameKeyPath;
*/
Custom ManagedObjectContext
NSManagedObjectContext *childContext = [[NSManagedObjectContext defaultContext] createChildContext];
[childContext performBlock:^{
User *john = [User createInContext:childContext];
john.name = @"John";
[john save];
john = [User first:@"name == 'John'" inContext:childContext];
NSArray *manyFriendsUsers = [User find:@"friendsCount > 100" order:@"screenName DESC" inContext:childContext];
NSArray *allUsers = [User allInContext:childContext];
}];
Custom CoreData model or .sqlite database
If you've added the Core Data manually, you can change the custom model and database name.
NSURL *modelURL = [NSURL defaultModelURL:@"model_name"];
[NSPersistentStoreCoordinator setupDefaultStoreWithModelURL:modelURL storeURL:nil useInMemoryStore:NO];
// or
NSURL *storeURL = [NSURL defaultStoreURL:@"file_name.sqlite"];
[NSPersistentStoreCoordinator setupDefaultStoreWithModelURL:nil storeURL:storeURL useInMemoryStore:NO];
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
.
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:
!! Date, Transformable Types are not supported !!
// just override +mappings in your NSManagedObject subclass
#import "User+Mappings.h"
@implementation User (Mappings)
+ (NSDictionary *)mappings
{
return @{@"description" : @"userDescription",
@"name" : @"fullName"};
}
// first_name => firstName is automatically handled
@end
/*
+ (NSDictionary *)mappings
+ (BOOL)useFindOrCreate
+ (BOOL)returnsObjectsAsFaults
+ (NSArray *)relationshipKeyPathsForPrefetching
*/
Testing
HobjectiveRecord supports CoreData's in-memory store. In any place, before your tests start running, it's enough to call
[NSPersistentStoreCoordinator setupDefaultStoreWithModelURL:nil storeURL:nil useInMemoryStore:YES];
License
HobjectiveRecord is available under the MIT license. See the LICENSE file for more information.