HobjectiveRecordとは
HobjectiveRecordはObjective-C製のCoreData用ライブラリーです。
オープンソースでGithubから自由に利用できます。
HobjectiveRecordの特徴
短いコード量でCoreDataを自由に操作できます。
特にバッググラウンド処理をベースにしているのでUIスレッドをブロックせず使うことも可能です。
CoreDataのバッググラウンド処理の詳細は以下の内容を参考してください。
HobjectiveRecordを利用
利用準備
- Github -> HobjectiveRecordからダウンロードして
HobjectiveRecordフォルダを利用するプロジェクトにコピー、
又はCocoaPodsを利用 pod 'HobjectiveRecord'
- 必要なファイルに
#import "HobjectiveRecord.h"を追加
初期化
1 2 3 4 5 6 7 8 9 10 11 12 13
| - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [NSPersistentStoreCoordinator setupDefaultStore]; return YES; }
|
Basic
基本、全ての処理はperformBlock:内で行う。
1 2 3 4 5 6 7
| [[NSManagedObjectContext defaultContext] performBlock:^{ }]; NSManagedObjectContext *childContext = [[NSManagedObjectContext defaultContext] createChildContext]; [childContext performBlock:^{ }];
|
Create / Save / Delete
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| [[NSManagedObjectContext defaultContext] performBlock:^{ Tweet *tweet = [Tweet create]; tweet.text = @"I am here"; [tweet save]; [tweet delete]; tweet = [Tweet create:@{@"text" : @"hello!!", @"lang" : @"en"} ]; [tweet saveToStore]; [Tweet deleteAll]; }];
|
Finders
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| [[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]; }];
|
Order and Limit
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| [[NSManagedObjectContext defaultContext] performBlock:^{ NSArray *sortedUsers = [User allWithOrder:@"name"]; NSArray *allUsers = [User allWithOrder:@"screenName ASC, name DESC"]; NSArray *allUsers2 = [User allWithOrder:@"screenName A, name D"]; 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)]; }];
|
Aggregation
1 2 3 4 5 6 7 8 9
| [[NSManagedObjectContext defaultContext] performBlock:^{ NSUInteger allUserCount = [User count]; NSUInteger englishUserCount = [User countWithCondition:@"lang == 'en'"]; }];
|
BatchUpdate
1 2 3 4 5 6 7 8 9 10 11
| [[NSManagedObjectContext defaultContext] performBlock:^{ [User batchUpdateWithCondition:@"friendsCount > 10" propertiesToUpdate:@{@"friendsCount": @0}]; [User batchUpdateWithCondition:nil propertiesToUpdate:@{@"friendsCount": @100}]; }];
|
NSFetchedResultsController
1 2 3 4 5 6 7 8 9 10 11 12 13
| [[NSManagedObjectContext defaultContext] performBlock:^{ NSFetchedResultsController *frc = [User createFetchedResultsControllerWithCondition:nil order:@"name" sectionNameKeyPath:nil]; frc.delegate = self; NSError *error = nil; if ([frc performFetch:&error]) { [self reloadData]; } } }];
|
Custom ManagedObjectContext
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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]; }];
|
カスタムモデル、カスタムsqliteファイルの利用
1 2 3 4 5 6
| NSURL *modelURL = [NSURL defaultModelURL:@"model_name"]; [NSPersistentStoreCoordinator setupDefaultStoreWithModelURL:modelURL storeURL:nil useInMemoryStore:NO];
NSURL *storeURL = [NSURL defaultStoreURL:@"file_name.sqlite"]; [NSPersistentStoreCoordinator setupDefaultStoreWithModelURL:nil storeURL:storeURL useInMemoryStore:NO];
|
マッピング
ウェブサービスからのJSONはfirst_name, last_nameのようなスネークケースの場合が多いですが、
Objective-CではfirstName, lastNameのようにキャメルケースが主流です。
なのでスネークケースからキャメルケースへのマッピングは自動で行われます。
それ以外の特別な名前マッピングが必要な場合は各モデルスラスでmappingsをオーバライドして設定可能です。
!! Date, Transformableタイプはマッピング対象外です。 !!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #import "User+Mappings.h"
@implementation User (Mappings)
+ (NSDictionary *)mappings { return @{@"description" : @"userDescription", @"name" : @"fullName"}; }
@end
|
テスト
HobjectiveRecordはメモリ内ストアを設定可能です。テストなどで利用すると便利です。
1
| [NSPersistentStoreCoordinator setupDefaultStoreWithModelURL:nil storeURL:nil useInMemoryStore:YES];
|