ObjectiveRecord:ActiveRecord的Objective-C版本
Objective Record 是一个轻量级的ActiveRecord,用于管理Core Data object。如果你对Ruby on Rails 有所了解,会发现两者十分相似。
不需要 AppDelegate 代码。完全由 Kiwi 测试。
使用
1.使用CocoaPods 安装或者 clone 到本地
2.在你的模型文件(model)或预编译头文件(.pch)中,导入 #import "ObjectiveReccord.h"
创建、保存与删除
1 2 3 4 5 6 7 8 9 10 |
Person *john = [Person create]; john.name = @"John"; [john save]; [john delete]; [Person create:@{ @"name" : @"John", @"age" : @12, @"member" : @NO }]; |
查找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 数据库中的所有Person实体 NSArray *people = [Person all]; // name == John 的实体 NSArray *johns = [Person where:@"name == 'John'"]; // name == John 且 surname == Doe 的实体 Person *johnDoe = [Person find:@"name == %@ AND surname == %@", @"John", @"Doe"]; // 多条件查询 NSArray *people = [Person where:@{ @"age" : @18, @"member" : @YES, @"state" : @"NY" }]; // 自定义谓词(NSPredicate)查询 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(name like[cd] %@) AND (birthday > %@)", name, birthday]; NSArray *results = [Person where:predicate]; |
排序和限定查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// People根据"surname"升序(A~Z)排序 NSArray *sortedPeople = [Person allWithOrder:@"surname"]; // 查询 named == John 的People,并根据"surname"倒序(Z~A)排序 NSArray *reversedPeople = [Person where:@{@"name" : @"John"} order:@{@"surname" : @"DESC"}]; // 使用 NSSortDescriptor 排序 NSArray *people = [Person allWithOrder:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]; // 同时使用多个排序命令 NSArray *morePeople = [Person allWithOrder:@"surname ASC, name DESC"]; // name==John,依据surname升序排序,截取前五个作为返回结果 NSArray *fivePeople = [Person where:@"name == 'John'" order:@{@"surname" : @"ASC"} limit:@(5)]; |
汇总
1 2 3 4 5 |
// 计算所有 Person 实体(entity)总数 NSUInteger personCount = [Person count]; // 计算所有 name==John 的 Person 总数 NSUInteger johnCount = [Person countWhere:@"name == 'John'"]; |
自定义 ManagedObjectContext
1 2 3 4 5 6 |
NSManagedObjectContext *newContext = [[NSManagedObjectContext alloc] 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]; |
自定义 CoreData model 或 .sqlite 数据库
1 2 |
[CoreDataManager sharedManager].modelName = @"MyModelName"; [CoreDataManager sharedManager].databaseName = @"custom_database_name"; |
例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 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映射
多数情况下,服务器返回的JSON数据中的key,多是这种:first_name,last_name。而其对应的ObjC文件中对属性却遵循驼峰命名法:firstName,lastName。
但从v1.2版本开始,你无需作任何改变,已经支持识别驼峰命名了。如果你需要设置更复杂的映射,也可以做到:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//在 NSManagedObject 的子类中复写 +mappings 方法 //这个方法只会被调用一次,你无需使用任何缓存(caching)或单例模式(singletons) @implementation Person + (NSDictionary *)mappings { return @{ @"id": @"remoteID", @"mmbr": @"isMember", // 你可以映射关系(map relationships), 并从line初始化graph @"employees": @{ @"class": [Person class] }, @"cars": @{ @"key": @"vehicles", @"class": [Vehicle class] } }; // first_name => firstName 会自动处理 } @end |
测试
ObjectiveRecord支持CoreData的内存型存储。 在任何地方,测试开始运行之前,调用
1 |
[[CoreDataManager sharedManager] useInMemoryStore]; |
路线图
- 支持 NSIncrementalStore