这是一个轻量级、多线程的 Core Data 栈。设计目标是易用性、编译时检查以及对一些常见用例的包装。
该库旨在涵盖大多数用例,倾向于约定优于配置,使您的生活更加轻松。如果您有一些特殊要求,例如复杂的多对象模型设置,那么这个库可能不适合您。对于更全面覆盖的解决方案,您可以查看 MagicalRecord。
该库只有一个持久化存储协调器和一条持久化存储。它是延迟加载的。如果您需要自定义它,请在首次使用之前调用:
+ (void)og_setupWithStoreType:(NSString *)storeType options:(NSDictionary *)options;
不需要其他设置。它应该会自动检测您的管理对象模型(假设您有一个且只有一个)。
您可以使用上下文以多种方式。而不是强迫您使用一个或两个上下文(例如,一个用于更新 UI 的上下文和一个用于导入数据的上下文),它要求您根据需要创建上下文。您可以有几个长期存在的上下文,或者根据需要丢弃它们,或者根据需要混合使用。这取决于您。
值得注意的是,所有上下文都与持久化存储协调器直接相关。如果您需要保持其他上下文的更新,请使用:
- (void)og_observeSavesInContext:(NSManagedObjectContext *)context;
和
- (void)og_stopObservingSavesInContext:(NSManagedObjectContext *)context;
可选地,您还可以使用 Contexts 子规范,它为您提供两个上下文:一个用于主线程,另一个用于在后台运行的重型操作。
通过管理对象子类上的类方法管理对象。
要创建一个对象
MyManagedObjectClass* object = [MyManagedObjectClass og_createObjectInContext:context];
要获取对象
NSArray* objects = [MyManagedObjectClass og_fetchWithRequest:^(NSFetchRequest *request) {
// set filter predicate and sort descriptors here
} context:context];
要计数对象
NSUInteger count = [MyManagedObjectClass og_countWithRequest:^(NSFetchRequest *request) {
// set filter predicate here
} context:context];
要删除对象,您可以直接操作或通过获取。
[myObject og_delete];
或者通过获取操作。
[MyManagedObjectClass og_deleteWithRequest:^(NSFetchRequest *request) {
// set filter predicate here
} context:context];
要更新 objects 的属性值,无需将它们加载到内存中,使用
NSNumber* updatedObjectCount;
BOOL success = [MyManagedObjectClass og_updateWithRequest:^(NSBatchUpdateRequest* request) {
// set filter predicate and resultType here, e.g
request.resultType = NSUpdatedObjectsCountResultType;
} context:context result:&updatedObjectsCount];
为了异步获取 objects
NSPersistentStoreAsynchronousResult* result = [MyManagedObjectClass og_fetchAsynchronouslyWithRequest:^(NSFetchRequest* request) {
// set filter predicate here
} progressTotal:1 context:context completion:^(BOOL success, NSArray* objects, NSError* error) {
if (success)
{
// do something the the objects
}
else
{
// check the error
}
}];
您可以检查操作的进度
NSProgress* progress = result.progress;
您可以取消操作
[result cancel];
尽管 Core Data 不是一个关系型数据库,它经常被用来缓存来自此类数据库的数据。如果您想这样做,为每个对象提供一个 id 属性是有用的。为此,使用 UniqueId 子规范,并在您的 NSManagedObject 子类中重写
+ (NSString *)og_uniqueIdAttributeName;
返回用作 id 属性的属性名称。这允许您使用一些创建和获取对象的便利方法
MyObject* object = [MyObject og_objectWithUniqueId:@873 allowNil:YES context:context];
对于多个对象
NSArray* objects = [MyObject og_objectsWithUniqueIds:idArray allowNil:YES context:context];
如果 allowNil 为 NO,将创建不对应对象的任何 id 的对象。
OGCoreDataStackVendor 是 NSFetchedResultsController 的装饰者,它有用于将其用作 UITableViews 和 UICollectionViews 数据源的子类。要使用 vendor 作为 UITableViewDataSource,使用 Vendor 子规范,并创建一个特定的 vendor 子类的实例
self.myVendor = [[OGTableViewManagedObjectVendor alloc] init];
[self.myVendor setEntity:EntityClass.class request:^(NSFetchRequest* request) {
// sort and filter the entity here
} context:myUIContext sectionNameKeyPath:nil cacheName:nil];
self.myVendor.tableView = myTableView;
self.myVendor.vending = YES;
您仍然需要实现 UITableViewDataSource 协议,但使用 vendor 来追踪部分数、每部分的 objects 数量和通过 NSIndexPath 获取 objects。然后,vendor 会根据底层对象的更改更新您的 tableview。
更具体的文档在头文件中。如果了解 Core Data 的基本概念,它真的很容易使用。查看 Apple 的文档。