CoreData基础与业务逻辑实现
立即解锁
发布时间: 2025-08-21 01:08:30 阅读量: 2 订阅数: 8 


Mac上学习Cocoa:从入门到实践
### Core Data 基础与业务逻辑实现
#### 1. Core Data 数据存储类型选择
在开发应用时,默认的 Core Data 应用模板会处理好数据存储,但在发布应用前,需要考虑数据存储类型的选择。常见的数据存储类型有:
- **NSXMLStoreType**:默认类型,但在大小、速度等方面可能不是最优选择。
- **NSBinaryStoreType**:以二进制格式保存数据,占用磁盘空间少,读写速度快。
- **NSSQLiteStoreType**:除具备 NSBinaryStoreType 的优点外,还无需将整个对象图一次性加载到内存中,仅在访问对象时加载,处理大数据集时优势明显,推荐在发布应用前从 NSXMLStoreType 切换到该类型。
- **NSInMemoryStoreType**:用于维护内存中的对象图,数据不会保存到磁盘。
此外,如果想将数据分区存储(如磁盘存储和内存存储),需要在 `persistentStoreCoordinator` 中进行相应更改,将每个持久存储添加到协调器中。
#### 2. 关键方法解析
##### 2.1 `managedObjectContext` 访问器方法
该方法是只读属性 `managedObjectContext` 的 getter 方法,代码如下:
```objc
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setValue:@"Failed to initialize the store" forKey:NSLocalizedDescriptionKey];
[dict setValue:@"There was an error building up the data file." forKey:NSLocalizedFailureReasonErrorKey];
NSError *error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
[[NSApplication sharedApplication] presentError:error];
return nil;
}
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
return _managedObjectContext;
}
```
此方法首先检查实例变量是否已设置,若已设置则返回;否则,调用 `persistentStoreCoordinator` 方法检查持久存储协调器是否存在,若不存在则报告错误并返回 `nil`,若存在则创建托管对象上下文并设置其持久存储协调器,最后返回该上下文。
##### 2.2 `NSWindow` 委托方法 `windowWillReturnUndoManager`
```objc
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window
{
return [[self managedObjectContext] undoManager];
}
```
该方法用于指定处理窗口撤销/重做操作的对象,使用 Core Data 的撤销管理器,通过托管对象上下文访问。
##### 2.3 `saveAction:` 动作方法
```objc
- (IBAction)saveAction:(id)sender
{
NSError *error = nil;
if (![[self managedObjectContext] commitEditing]) {
NSLog(@"%@:%@ unable to commit editing before saving", [self class], NSStringFromSelector(_cmd));
}
if (![[self managedObjectContext] save:&error]) {
[[NSApplication sharedApplication] presentError:error];
}
}
```
当用户点击相关菜单项时调用该方法。它先确保所有待编辑的内容提交到基础模型对象,若提交失败则打印警告信息,然后将所有模型对象保存到存储中,若保存失败则向用户显示错误。
##### 2.4 `NSApplication` 委托方法 `applicationShouldTerminate:`
```objc
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
if (!_managedObjectContext) {
return NSTerminateNow;
}
if (![[self managedObjectContext] commitEditing]) {
NSLog(@"%@:%@ unable to commit editing to terminate", [self class], NSStringFromSelector(_cmd));
return NSTerminateCancel;
}
if (![[self managedObjectContext] hasChanges]) {
return NSTerminateNow;
}
NSError *error = nil;
if (![[self managedObjectContext] save:&error]) {
BOOL result = [sender presentError:error];
if (result) {
return NSTerminateCancel;
}
NSString *question = NSLocalizedString(@"Could not save changes while quitting. Quit anyway?", @"Quit without saves error question message");
NSString *info = NSLocalizedString(@"Quitting now will lose any changes you have made since the last successful save", @"Quit without saves error question info");
NSString *quitButton = NSLocalizedString(@"Quit anyway", @"Quit anyway button title");
NSString *cancelButton = NSLocalizedString(@"Cancel", @"Cancel button title");
NSAlert *alert = [[NSAlert alloc] init];
[alert setMessageText:question];
[alert setInformativeText:info];
[alert addButtonWithTitle:quitButton];
[alert addButtonWithTitle:cancelButton];
NSInteger answer = [alert runModal];
if (answer == NSAlertAlternateReturn) {
return NSTerminateCancel;
}
}
return NSTerminateNow;
}
```
当用户选择退出应用时调用该方法,它会检查 `managedObjectContext` 是否存在,若不存在则直接终止应用;若存在则提交待更改的内容,若提交失败则取消终止操作;接着检查是否有未保存的更改,若没有则终止应用;最后尝试保存更改,若保存失败则弹出警告框询问用户是否继续退出。需要注意的是,该方法在检查取消按钮是否被按下时存在一个小错误,应使用 `NSAlertSecondButtonReturn` 而非 `NSAlertAlternateReturn`。
#### 3. 添加业务逻辑
在了解了使用 Core Data 构建应用的基本思路后,接下来学习如何在模型对象中实现业务逻辑。
##### 3.1 创建 `MythicalPerson` 类
要实现业务逻辑,需要创建 `NSManagedObject` 的子类来表示 `MythicalPerson` 实体。步骤如下:
1. 点击 `File ➤ New ➤ File`(或按 ⌘N)。
2. 在模板选择器中,从左侧的 OS X 部分选择 `Core Data`。
3. 从主窗口中选择 `NSManagedObject subclass`,点击 `Next`。
4. 在出现的表格视图中,勾选 `MythBase`,表示创建一个与 `MythBase` 数据模型中的实体一起工作的 `NSManagedObject` 子类,点击 `Next`。
5. 由于只定义了一个实体,选择 `MythicalPerson`,点击 `Next`。
6. 选择文件保存位置,保持其他选项为默认值,点击 `Create`。
生成的 `MythicalPerson.h` 文件内容如下:
```objc
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface MythicalPerson : NSManagedObject
@property (nonatomic, retain) id depiction;
@property (nonatomic, retain) NSString * d
```
0
0
复制全文
相关推荐







