CoreData开发实战:项目管理与关系建立
立即解锁
发布时间: 2025-08-21 01:59:26 阅读量: 1 订阅数: 9 

### Core Data 开发实战:项目管理与关系建立
#### 1. 项目类定义与初步测试
在 Core Data 开发中,首先定义了 `Project` 类,它继承自 `NSManagedObject`。以下是 `Project.h` 和 `Project.m` 的代码:
```objc
// Project.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface Project : NSManagedObject
@property (nonatomic, retain) NSString * descrip;
@property (nonatomic, retain) NSDate * dueDate;
@property (nonatomic, retain) NSString * name;
@end
// Project.m
#import "Project.h"
@implementation Project
@dynamic descrip;
@dynamic dueDate;
@dynamic name;
@end
```
若将相关代码添加到 Xcode 项目中并多次构建运行,会发现数据存储中的项目列表每次运行都会增加一个项目。这是因为在应用委托开始时创建的新项目会被添加到数据存储中已有的所有项目中。首次运行应用时,输出大致如下:
```plaintext
project.name = App Delegate's Project
project.descrip = This is a new project
project.dueDate = 2012-04-12 15:08:13 +0000
HERE ARE THE PROJECTS IN THE DATA STORE
project.name = App Delegate's Project
project.descrip = This is a new project
project.dueDate = 2012-04-12 15:08:13 +0000
```
#### 2. 数据存储变更处理
当用户使用应用程序时,会对内容进行更改,需要将这些更改保存到数据存储中。
- **问题**:用户操作导致内容更改,需保存到数据存储。
- **解决方案**:测试托管对象上下文,查看用户对象图是否有更改。若有更改,可回滚并丢弃更改,或保存更改到数据存储。
- **工作原理**:托管对象的使用方式与其他 Objective - C 对象类似,可使用点符号更改托管对象的内容。一旦进行更改,托管对象上下文会感知到对象图的变化。
例如,更改项目内容:
```objc
newProject.name = @"Project Has New Name";
newProject.descrip = @"Here is a new revision of the project";
```
可以通过向上下文发送 `hasChanges` 消息来询问托管对象上下文对象图是否有更改:
```objc
if([[dataModel managedObjectContext] hasChanges])
NSLog(@"The object graph has changed");
```
若要保存更改,可使用以下代码:
```objc
if([[dataModel managedObjectContext] hasChanges])
[[dataModel managedObjectContext] save:nil];
```
若要丢弃更改,可发送 `rollback` 消息:
```objc
if([[dataModel managedObjectContext] hasChanges])
[[dataModel managedObjectContext] rollback];
```
若要删除托管对象,需使用托管对象上下文的 `deleteObject` 方法:
```objc
[[dataModel managedObjectContext] deleteObject:newProject];
```
#### 3. 代码示例
以下是一系列相关代码文件:
- **AppDelegate.h**
```objc
#import <UIKit/UIKit.h>
#import "AppModel.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
```
- **AppDelegate.m**
```objc
#import "AppDelegate.h"
@implementation AppDelegate
@synthesize window = _window;
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
// Create a new AppModel instance
AppModel *dataModel = [[AppModel alloc] init];
// Make some projects
Project *p1 = [dataModel makeNewProject];
p1.name = @"Proj1";
Project *p2 = [dataModel makeNewProject];
p2.name = @"Proj2";
Project *p3 = [dataModel makeNewProject];
p3.name = @"Proj3";
Project *p4 = [dataModel makeNewProject];
p4.name = @"Proj4";
[[dataModel managedObjectContext] save:nil];
// Get all the projects in the data store
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Project"
inManagedObjectContext:[dataModel managedObjectContext]];
request.entity = entity;
NSArray *listOfProjects = [[dataModel managedObjectContext]
executeFetchRequest:request error:nil];
// Print out contents of all the projects
NSLog(@"-----");
NSLog(@"NEW PROJECTS IN CONTEXT");
[listOfProjects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"project.name = %@", [obj name]);
}];
// Rollback example
Project *rollbackProject = [listOfProjects objectAtIndex:0];
rollbackProject.name = @"Rollback Project";
// look at changed object
NSLog(@"-----");
NSLog(@"CHANGED PROJECTS IN CONTEXT");
[listOfProjects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"project.name = %@", [obj name]);
}];
// Discard changes
if([[dataModel managedObjectContext] hasChanges])
[[dataModel managedObjectContext] rollback];
// look at object after rollback
NSLog(@"-----");
NSLog(@"PROJECTS IN CONTEXT AFTER ROLLBACK");
[listOfProjects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"project.name = %@", [obj name]);
}];
// Delete second and third projects
[[dataModel managedObjectContext] deleteObject:p2];
```
0
0
复制全文
相关推荐










