构建基于CoreData的词汇列表应用指南
立即解锁
发布时间: 2025-08-25 01:37:27 阅读量: 2 订阅数: 20 


iOS 7开发实战:从入门到精通
### 构建基于 Core Data 的词汇列表应用指南
#### 1. Core Data 基础概念
在基于 Core Data 的应用开发中,有几个关键的类需要了解:
- **NSManagedObjectContext**:在应用的各个部分之间传递该类的指针是常见做法,通常为每个视图控制器添加一个 `NSManagedObjectContext` 属性。
- **NSManagedObject**:代表数据模型中实际数据的实例。
- **NSFetchedResultsController**:这是通过 `NSManagedObjectContext` “获取”结果的主要类,功能强大且易于使用,尤其与 `UITableView` 结合使用时。
#### 2. 配置 Core Data
为应用设置 Core Data 最简单的方法是在创建项目时让 Xcode 生成必要的代码,具体步骤如下:
1. 使用“Empty Application”模板创建一个名为“Recipe 15 - 3 Using Core Data”的新项目。
2. 在输入项目名称的界面,确保选中“Use Core Data”复选框。
3. 点击“Next”,然后在接下来的对话框中点击“Create”完成项目创建。
#### 3. 设计数据模型
本应用的数据模型仅包含词汇表(Vocabulary)和单词(Word)。在设计数据模型时,需要了解以下概念:
- **实体(Entity)**:相当于 Core Data 中的类,代表将存储在模型中的特定对象类型。
- **属性(Attribute)**:类似于对象的属性,是与实体关联的简单数据,如名称、年龄或生日等,不需要指向其他实体的指针。
- **关系(Relationship)**:用于一个实体指向另一个实体,可分为一对一(to - one)或一对多(to - many)关系。一对多关系中,一个实体指向多个其他实体的集合。还可以设置反向关系,方便实体之间的双向访问。
本应用的数据模型如下表所示:
| 实体 | 属性 | 关系 |
| ---- | ---- | ---- |
| Vocabulary | name | words |
| Word | word, translation | vocabulary |
在 Xcode 中构建数据模型的步骤如下:
1. 切换到项目中的数据模型文件 `Recipe_15_3_Using_Core_Data.xcdatamodeld`。
2. 添加两个实体:可以使用“Editor”菜单或 Xcode 窗口底部中央的“Add Entity”按钮。添加后,将一个实体重命名为“Vocabulary”,另一个重命名为“Word”。
3. 配置“Vocabulary”实体:
- 在“Attributes”部分,使用“+”按钮添加一个名为“name”的属性,类型选择“String”。
- 在“Relationships”部分,使用“+”按钮添加一个名为“words”的关系,目标实体设置为“Word”,暂时不设置反向关系。
- 将“words”关系定义为一对多关系,在“Data Model Inspector”中选中“To - Many relationship”选项。
- 将“Delete Rule”设置为“Cascade”,这样删除词汇表时,相关的单词也会被删除。
4. 配置“Word”实体:
- 在“Attributes”部分,添加两个属性“word”和“translation”,类型都为“String”。
- 在“Relationships”部分,添加一个名为“vocabulary”的关系,目标实体设置为“Vocabulary”,并将反向关系设置为“words”。
5. 创建映射到实体的 Objective - C 类:选择“Vocabulary”实体,从“Editor”菜单中选择“Create NSManagedObject Subclass”,然后选择“Vocabulary”和“Word”实体,点击“Next”,再点击“Create”,项目中会添加名为“Vocabulary”和“Word”的新类。
为了直观查看数据模型,可以在“Data Model Editor”的右下角将“Editor Style”更改为“Graph”。
#### 4. 设置词汇表表格视图
接下来,设置一个基于导航的应用,其主表格视图显示词汇表列表,具体步骤如下:
1. 添加一个新类 `VocabulariesViewController`,使其成为 `UITableViewController` 的子类,不使用 `.xib` 文件。
2. 修改 `VocabulariesViewController.h` 文件,代码如下:
```objc
//
// VocabulariesViewController.h
// Recipe 15-3 Using Core Data
//
#import <UIKit/UIKit.h>
#import "Vocabulary.h"
@interface VocabulariesViewController : UITableViewController<UIAlertViewDelegate>
@property (strong, nonatomic)NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic)NSFetchedResultsController *fetchedResultsController;
- (id)initWithManagedObjectContext:(NSManagedObjectContext *)context;
@end
```
这里,`fetchedResultsController` 属性用于跟踪获取的数据,`managedObjectContext` 属性用于进行数据请求。让视图控制器遵循 `UIAlertViewDelegate` 协议是为了后续使用警告视图作为词汇表名称的输入对话框。
3. 实现自定义初始化方法,修改 `VocabulariesViewController.m` 文件:
```objc
- (id)initWithManagedObjectContext:(NSManagedObjectContext *)context
{
self = [super initWithStyle:UITableViewStylePlain];
if (self)
{
self.managedObjectContext = context;
}
return self;
}
```
4. 添加辅助方法 `fetchVocabularies`,用于获取数据模型中的所有词汇表并存储在 `fetchedResultsController` 属性中:
```objc
-(void)fetchVocabularies
{
NSFetchRequest *fetchRequest =
[NSFetchRequest fetchRequestWithEntityName:@"Vocabulary"];
NSString *cacheName = [@"Vocabulary" stringByAppendingString:@"Cache"];
NSSortDescriptor *sortDescriptor =
[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
[fetchRequest setSortDescriptors:@[sortDescriptor]];
self.fetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext
sectionNameKeyPath:nil cacheName:cacheName];
NSError *error;
if (![self.fetchedResultsController performFetch:&error])
{
NSLog(@"Fetch failed: %@", error);
}
}
```
该方法的具体步骤如下:
1. 创建 `NSFetchRequest` 类的实例,指定要获取的实体名称。
2. 设置“缓存名称”,用于提高频繁获取请求的速度。
3. 为 `NSFetchRequest` 关联至少一个 `NSSortDescriptor`,这里按名称属性进行字母排序。
4. 使用配置好的 `NSFetchRequest` 和 `NSManagedObjectContext` 初始化 `NSFetchedResultsController`,并指定缓存名称进行优化。
5. 调用 `performFetch:` 方法完成获取请求并检索存储的数据,同时传递一个 `NSError` 指针来记录错误。
5. 在 `viewDidLoad` 方法中初始化视图控制器:
```objc
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"Vocabularies";
[self fetchVocabularies];
}
```
为避免应用首次运行时显示空列表,在 `viewDidLoad` 方法中添加预加载“Spanish”词汇表的代码:
```objc
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"Vocabularies";
[self fetchVocabularies];
// Preload with a "Spanish" Vocabulary if empty
if (self.fetchedResultsController.fetchedObjects.count == 0)
{
NSEntityDescription *vocabularyEntityDescription =
[NSEntityDescription entityForName:@"Vocabulary"
inManagedObjectContext:self.managedObjectContext];
Vocabulary *spanishVocabulary = (Vocabulary *)[[NSManagedObject alloc]
initWithEntity:vocabularyEntityDescription
insertIntoManagedObjectContext:self.managedObjectContext];
spanishVocabulary.name = @"Spanish";
NSError *error;
if (![self.managedObjectContext save:&error])
{
NSLog(@"Error saving context: %@", error);
}
[self fetchVocabularies];
```
0
0
复制全文
相关推荐









