NLCoreData 0.5.3

NLCoreData 0.5.3

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2014年12月

Jesper 维护。



  • 作者:
  • Jesper Skrufve

NLCoreData 旨在作为 iOS 上绝大多数 Core Data 需求的即插即用包装器(在 OS X 上未经测试)。需要 ARC。需要 iOS 5 以上。

目标

  • 写更少的代码。
  • 使代码更易读。
  • 更多编译时检查。

通过 NSManagedObject 子类上的类方法和实例方法访问插入、删除、计数和提取的便捷方法。

你不再通过输入一个实体名称的 NSString 来访问对象,而是使用实体类或类方法 +entityName。不要使用 @"Person",而是使用 [Person class] 或 [Person entityName]。这提供了编译时的拼写检查。

NLCoreData 不适合你如果:

  • 你需要一个以上的持久存储。
  • 你不希望子类化 NSManagedObject

初始化

如果你的 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"];

注意

  • 请确保您已对所有的 Core Data 实体进行了子类化。如果实体的名称与子类不同,请在子类中重写 +entityName 类方法并返回实体名称。
  • 我强烈推荐使用 mogenerator。这是一个非常优秀的工具。您可以通过 homebrew 或在 http://rentzsch.github.com/mogenerator 获取。

配置

  1. 将 NLCoreData 文件夹添加到您的项目中。

  2. 在需要的地方(在 prefix.pch 中以方便访问)导入 "NLCoreData.h"。

  3. 可选地,设置 modelName 为您的模型名称:[[NLCoreData shared] setModelName:@"MyModel"];

如果您的模型名称与包/应用程序名称相同,则可以跳过第 3 步。