NLCoreData 旨在作为 iOS 上绝大多数 Core Data 需求的即插即用包装器(在 OS X 上未经测试)。需要 ARC。需要 iOS 5 以上。
通过 NSManagedObject 子类上的类方法和实例方法访问插入、删除、计数和提取的便捷方法。
你不再通过输入一个实体名称的 NSString 来访问对象,而是使用实体类或类方法 +entityName。不要使用 @"Person",而是使用 [Person class] 或 [Person entityName]。这提供了编译时的拼写检查。
如果你的 Core Data 模型名称与主捆绑包的名称不同,你需要在首次使用前设置模型名称。通常在 application:didFinishLaunchingWithOptions:。
[[NLCoreData shared] setModelName:@"MyCoreDataModel"];
你有提供预种植 sqlite 数据库的选项。首先,检查 Core Data 是否已经初始化。通常在 application:didFinishLaunchingWithOptions: 的首次运行
if ([[NLCoreData shared] storeExists] == NO)
[[NLCoreData shared] usePreSeededFile:pathToMyFile];
NLCoreData 提供三个懒加载数据库 nebula 的 NSManagedObjectContexts。对于主(UI)线程,使用
NSManagedObjectContext* context = [NSManagedObjectContext mainContext];
如果你正在进行一些重负载工作,并且不希望阻塞主线程,使用
NSManagedObjectContext* context = [NSManagedObjectContext backgroundContext];
有时你可能希望跳过上下文同步并简单地更改存储值。你可以使用以下方式访问持久存储的上下文
NSManagedObjectContext* context = [NSManagedObjectContext storeContext];
保存上下文
BOOL success = [context save];
这不会将值持久化到它们自己的上下文之外。要确保对象被持久化,使用
BOOL success = [context saveNested];
或
[context saveNestedAsynchronous];
后台上下文和存储上下文在私有派发队列上运行,因此应对它们上的任何操作使用 performBlock 包装
NSManagedObjectContext* context = [NSManagedObjectContext backgroundContext];
[context performBlock:^{
// insert or fetch new data here.
}];
和以往一样,永远不要在上下文之间传递 NSManagedObject,而应该使用 objectID。
如果你想要检索主上下文中的所有 Person 对象
NSArray* results = [Person fetchWithPredicate:nil];
如果你想要删除所有 Person 对象并持久化更改
[Person deleteWithRequest:nil context:[NSManagedObjectContext storeContext]];
[[NSManagedObjectContext storeContext] saveNested];
如果你想计算与 myPredicate 匹配的所有 Person 对象(在主上下文中)的数量
NSUInteger count = [Person countWithPredicate:myPredicate];
您可以选择提取一个对象数组或单个对象。如果您想在主上下文中获取所有Person对象
NSArray* results = [Person fetchWithPredicate:nil];
如果您想获取共享上下文中的单个对象
Person* person = [Person fetchSingleWithPredicate:nil];
如果只有一个此类对象或您提供的谓词只匹配一个对象,则单次提取可能很有用。
在某些情况下,您可能想返回单个对象,或者如果不存在则创建一个
Person* person = [Person fetchOrInsertSingleWithPredicate:nil];
如果您需要创建 NSFetchRequest(例如,用于 NSFetchedResultsController),可以使用提供的便捷方法。
NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntity:[Person class]];
通过 sortByKey:ascending: 配置了 setSortDescriptors:。尽管还可用 setSortDescriptors:,但不要在同一个 NSFetchRequest 上同时使用两者。
[request sortByKey:@"myKeyPath" ascending:NO];
[request sortByKey:@"mySecondaryKeyPath" ascending:YES];
您也可以内联设置谓词
[request setPredicateOrString:@"myAttribute == YES"];
将 NLCoreData 文件夹添加到您的项目中。
在需要的地方(在 prefix.pch 中以方便访问)导入 "NLCoreData.h"。
可选地,设置 modelName 为您的模型名称:[[NLCoreData shared] setModelName:@"MyModel"];
如果您的模型名称与包/应用程序名称相同,则可以跳过第 3 步。