HobjectiveRecord 受 ObjectiveRecord 启发,并针对 NSManagedObjectContext
后台进行了定制。
在使用之前,建议您阅读以下文章
您可以使用 Swift 与 HobjectiveRecord 一起使用。check HobjectiveRecordDemo-Swift 或使用以 Swift 编写的 SobjectiveRecord
HobjectiveRecord
中的所有文件复制到您的项目中。pod 'HobjectiveRecord'
#import "HobjectiveRecord.h"
。- (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;
*/
使用 performBlock:
[[NSManagedObjectContext defaultContext] performBlock:^{
// your code here
}];
NSManagedObjectContext *childContext = [[NSManagedObjectContext defaultContext] createChildContext];
[childContext performBlock:^{
// your code here
}];
[[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];
}];
/*
+ (instancetype)create;
+ (instancetype)create:(NSDictionary *)attributes;
+ (void)deleteAll;
+ (void)deleteWithCondition:(id)condition;
- (void)save;
- (void)saveToStore;
- (void)delete;
*/
[[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;
*/
[[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;
*/
[[NSManagedObjectContext defaultContext] performBlock:^{
NSUInteger allUserCount = [User count];
NSUInteger englishUserCount = [User countWithCondition:@"lang == 'en'"];
}];
/*
+ (NSUInteger)count;
+ (NSUInteger)countWithCondition:(id)condition;
*/
[[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;
*/
[[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;
*/
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];
}];
如果您已经手动添加了 Core Data,则可以更改自定义模型和数据库名称。
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];
大多数情况下,您的 JSON 网络服务返回的键类似于 first_name
、last_name
等。
您的 ObjC 实现具有 camelCased 属性 - firstName
、lastName
。
camel case 自动支持 - 您无需做任何事情!否则,如果您有更复杂的映射,以下是您如何操作
!! 不支持日期,可转型类型 !!
// 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
*/
HobjectiveRecord 支持 CoreData 的内存存储。在任何地方,在您的测试开始运行之前,只需调用
[NSPersistentStoreCoordinator setupDefaultStoreWithModelURL:nil storeURL:nil useInMemoryStore:YES];
HobjectiveRecord 在 MIT 许可下提供。有关更多信息,请参阅 LICENSE 文件。