CoreData数据管理与用户界面搭建
立即解锁
发布时间: 2025-08-24 01:06:59 阅读量: 1 订阅数: 37 


Objective-C编程与应用开发实战
### Core Data 数据管理与用户界面搭建
#### 1. 数据填充
在数据存储中,我们需要一些数据。由于这是一个地址簿应用程序,从自己的地址簿加载数据作为测试数据是合适的。可以使用 AddressBook.framework 中的 API 从 Contacts 应用程序读取数据,该 API 提供了用于枚举人员及其相关数据的 Objective - C API。
##### 1.1 检查初始数据导入
在应用程序启动时,需要检查数据存储中是否已经存在 Person 对象。若不存在,则创建一个导入器对象来填充数据。在 APAppDelegate.m 中找到 `applicationDidFinishLaunching:` 方法,并将其内容替换为以下代码:
```objc
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
NSManagedObjectContext * context = [self managedObjectContext];
[context performBlock: ^{
NSUInteger count = [context countForFetchRequest: request error: NULL];
if ( count == 0 )
{
dispatch_async(dispatch_get_main_queue(), ^{
[self importAddressBookData];
});
}
}];
}
```
##### 1.2 创建地址簿导入器
要进行数据导入,需要创建一个 `APAddressBookImporter` 类。具体步骤如下:
1. 在 Project Navigator 中右键点击(或 Control - 点击,或双指点击)APApplicationDelegate.m,从弹出菜单中选择 New File。
2. 在出现的面板中,确保左侧 OS X 组中的 Cocoa 部分被选中,从右侧文档列表中选择 Objective - C 类。
3. 点击 Next,输入类名 `APAddressBookImporter`,在弹出列表中选择 NSObject 作为其父类。
4. 点击 Next,然后点击 Choose 选择默认位置放置新文件。
该类的接口如下:
```objc
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface APAddressBookImporter : NSObject
- (id)initWithParentObjectContext:(NSManagedObjectContext *)parent;
- (void)beginImportingWithCompletion:(void (^)(NSError *error)) completion;
@end
```
其实现文件 `APAddressBookImporter.m` 中,初始化方法如下:
```objc
#import "APAddressBookImporter.h"
#import <AddressBook/AddressBook.h>
#import "Person.h"
#import "MailingAddress.h"
#import "EmailAddress.h"
#import "PhoneNumber.h"
@implementation APAddressBookImporter
{
NSManagedObjectContext *_context;
}
- (id) initWithParentObjectContext: (NSManagedObjectContext *) parent
{
self = [super init];
if ( self == nil )
return ( nil );
_context = [[NSManagedObjectContext alloc] initWithConcurrencyType:
NSPrivateQueueConcurrencyType];
[_context setParentContext: parent];
return ( self );
}
@end
```
同时,为了保存 `beginImportingWithCompletion:` 方法传入的完成块,需要在 `@implementation` 块上方添加以下代码:
```objc
@interface APAddressBookImporter ()
@property (nonatomic, copy) void (^completionHandler)(NSError *);
@end
```
导入方法的起始部分如下:
```objc
- (void) beginImportingWithCompletion: (void (^)(NSError *)) completion
{
self.completionHandler = completion;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
ABAddressBook * addressBook = [ABAddressBook addressBook];
});
}
```
在工作块中,需要准备实体描述以创建对象,并枚举 `ABPerson` 记录:
```objc
NSEntityDescription *entity = [NSEntityDescription entityForName: @"Person"
inManagedObjectContext: _context];
for ( ABPerson * abPerson in [addressBook people] )
{
Person * myPerson = [[Person alloc] initWithEntity: entity
insertIntoManagedObjectContext: _context];
myPerson.firstName = [abPerson valueForProperty: kABFirstNameProperty];
myPerson.lastName = [abPerson valueForProperty: kABLastNameProperty];
[self importEmailsFromABPerson: abPerson toMine: myPerson];
[self importPhonesFromABPerson: abPerson toMine: myPerson];
[self im
```
0
0
复制全文
相关推荐









