CoreData基础:从界面构建到代码实现
立即解锁
发布时间: 2025-08-21 01:08:29 阅读量: 2 订阅数: 8 


Mac上学习Cocoa:从入门到实践
# Core Data 开发指南:从界面绑定到代码实现
## 1. 界面绑定操作
### 1.1 按钮绑定
在开发过程中,需要为添加和删除按钮的“Enabled”属性建立绑定。具体操作步骤如下:
1. 选择“Add”按钮,打开“Bindings Inspector”。
2. 展开“Availability”下的“Enabled”部分。
3. 勾选“Bind to”复选框,确保下拉菜单显示“Mythical Person Array Controller”。
4. 将“Controller Key”字段改为“canAdd”。当在“Controller Key”字段中输入时,会出现潜在的补全列表。
5. 对“Remove”按钮执行相同操作,将“Controller Key”改为“canRemove”。
完成上述操作后,保存 nib 文件并点击“Run”进行测试。此时,应该能够点击“Add”按钮在表格视图中获得空白行,还可以编辑名称、移动滑块,并且更改会反映在表格视图的选中行中。如果未达到预期效果,需要检查 nib 文件中的绑定和连接是否与上述步骤一致。
### 1.2 保存功能绑定
应用程序需要具备保存功能,而 Xcode 生成的“Application Delegate”类会为我们管理保存操作,我们只需指定触发时机。操作步骤如下:
1. 在“Interface Builder”的“Object Dock”中,展开“Main Menu”对象,再展开“File”菜单,然后展开“Menu Item – Save”项。注意这里指的是“Object Dock”中的对象,而非 Xcode 自身的菜单。
2. 按住“Control”键拖动连接到“Object Dock”中的“App Delegate”,并从列表中选择“saveAction:”操作。
### 1.3 搜索功能绑定
搜索功能相对复杂,Core Data 的搜索支持基于谓词。谓词由属性名、运算符和搜索值组成,一个搜索字段可以支持多个谓词。例如,“name contains Heracles”或“goodness greater than 75”就是两个谓词的示例。对于“MythBase”,除“depiction”外,“MythicalPerson”实体的所有属性都应可搜索,因为二进制和可转换属性本质上不可搜索。以下是定义搜索谓词的步骤:
#### 1.3.1 按名称属性搜索
1. 选择屏幕右上角的搜索字段,打开“Bindings Inspector”。
2. 在“Bindings Inspector”底部附近找到名为“Predicate”的部分并打开。
3. 勾选“Bind to”复选框,将其绑定到“Mythical Person Array Controller”。
4. 将“Controller Key”设置为“filterPredicate”。
5. 将“Display Name”设置为“Name”,将谓词格式设置为“name contains[c] $value”。其中,“$value”表示搜索框的内容,“name”表示要搜索的“MythicalPerson”实体属性。“contains[c]”运算符表示进行不区分大小写的搜索,若去掉“[c]”,则搜索区分大小写。
#### 1.3.2 按所有可搜索字段搜索
此时会创建一个名为“Predicate2”的新绑定,使用它来定义按所有可搜索字段搜索的谓词。操作步骤与按名称属性搜索类似:
1. 打开“Predicate2”,勾选“Bind to”复选框,绑定到“Mythical Person Array Controller”。
2. 将“Controller Key”设置为“filterPredicate”。
3. 将“Display Name”设置为“All”,将谓词格式设置为“(name contains $value) or (divinity.description contains $value) or (power.description contains $value) or (goodness.description contains $value) or (details contains[c] $value)”。
此外,还会出现一个名为“Predicate3”的新绑定。如果需要按其他特定字段(如“name”或“details”)进行搜索,可以按照上述模式添加更多谓词,只需在谓词格式值中适当更改字段名即可。苹果在 Xcode 文档的“Predicate Programming Guide”部分详细介绍了构建搜索谓词的更多可能性。
完成所有绑定后,点击 Xcode 窗口左上角的“Run”按钮运行应用程序。此时,应该能够创建一些“Mythical Person”记录,将图像拖入大图像框以显示图片,使用“File ➤ Save”菜单项保存记录,以及搜索数据库。搜索字段左边缘的问号图标可让你选择使用哪个搜索谓词。当退出并重新运行应用程序时,记录应会被保留并在启动时重新加载。
## 2. 模板代码探索
### 2.1 应用委托类概述
创建“MythBase”项目时,会生成一个名为“MBAppDelegate”的应用委托类。该类的主要功能包括:
- 从应用程序包含的 Core Data 模型文件中加载模型信息。
- 打开 Core Data 读写模型对象的磁盘存储,如果存储不存在则创建它。
- 通过“NSManagedObjectContext”提供对数据存储的访问,其他对象(如 nib 文件中的数组控制器)可以绑定到该上下文以进行数据的读写操作。
### 2.2 应用委托类接口
#### 2.2.1 代码示例
以下是“MBAppDelegate.h”头文件的代码:
```objc
#import <Cocoa/Cocoa.h>
@interface MBAppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
- (IBAction)saveAction:(id)sender;
@end
```
#### 2.2.2 代码解释
这段代码声明了一个简单的类,包含四个属性和一个方法:
- “window”变量的属性声明中包含“IBOutlet”,这使其成为一个可在“Interface Builder”中连接到窗口的出口。
- 其他三个属性是一些重要的 Core Data 类的实例:
- “NSPersistentStoreCoordinator”:管理后台存储,提供对一个或多个“NSPersistentStore”实例的访问,每个实例代表一个存储位置(文件或内存)。其目的是让应用程序将多个持久存储视为一个整体进行访问。例如,可用于将应用程序数据划分到多个存储中,区分保存到磁盘的普通实体和仅保存在内存中、用户退出应用程序时会消失的临时实体。即使临时对象不保存到磁盘,它们仍可受益于 Core Data 的其他功能(如简单的撤销支持、与 Cocoa 绑定的集成等)。
- “NSManagedObjectModel”:从一个或多个模型文件(通常包含在应用程序包中)加载实体及其属性的信息,充当包含应用程序托管对象结构的元数据存储库。许多应用程序可能无需直接与之交互。
- “NSManagedObjectContext”:负责处理所有托管对象(通过 Core Data 存储的模型对象)的生命周期。它通过“NSPersistentStoreCoordinator”访问对象本身,并提供创建、读取、更新和删除对象的高级功能。大多数应用程序在某些时候会使用“NSManagedObjectContext”来创建对象、保存更改等。
头文件中的最后一个声明是“saveAction:”方法,当用户从“MythBase”菜单中选择“File ➤ Save”时会调用该方法。
### 2.3 应用委托类实现
#### 2.3.1 代码结构
以下是“MythBase_AppDelegate.m”文件的部分代码:
```objc
#import "MBAppDelegate.h"
@implementation MBAppDelegate
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize managedObjectContext = _managedObjectContext;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
}
// Returns the directory the appli
```
0
0
复制全文
相关推荐










