HobjectiveRecord 0.3.2

HobjectiveRecord 0.3.2

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布日期最后发布2015年3月

hmhv 维护。



  • hmhv

HobjectiveRecord 受 ObjectiveRecord 启发,并针对 NSManagedObjectContext 后台进行了定制。

在使用之前,建议您阅读以下文章

您可以使用 Swift 与 HobjectiveRecord 一起使用。check HobjectiveRecordDemo-Swift 或使用以 Swift 编写的 SobjectiveRecord

用法

  1. 将文件夹 HobjectiveRecord 中的所有文件复制到您的项目中。
    或使用 CocoaPods CocoaPods 安装 pod 'HobjectiveRecord'
  2. 在您的代码或 .pch 文件中导入 #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;
*/

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;
*/

自定义 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];
}];

自定义 CoreData 模型或 .sqlite 数据库

如果您已经手动添加了 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_namelast_name 等。
您的 ObjC 实现具有 camelCased 属性 - firstNamelastName

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 文件。