CoreData实例分析学习(1)
2009年12月15日 23:00
Core Data是个好东西,在数据储存操作上速度快,容易操作,是一种类似关系数据库的东西。但是有些不那么好学,那到底Core Data是怎么操作的呢?怎么用呢?怎么来编程呢?我们一起来学习吧,接下来使用苹果提供的实例程序Locations来作分析:
>程序介绍:
右侧是改程序的截图,基本上来说就是通过使用Core Location来得到当时的位置,然后在点击“+”的时候记录下当时的经纬度。通过UITableViewController的功能来添加,编辑,删除等功能。整体程序使用Core Data来储存数据,实体(Entity)为一个位置,包括以下参数:1,时间(收集数据的时间)2,纬度,3,经度
首先我们看看该程序的AppDelegate.h
-
UIWindow *window;
-
UINavigationController *navigationController; //导航栏
-
-
//以下定义了Core Data的三个决定性组建,等后面m文件里面再多介绍
-
NSPersistentStoreCoordinator *persistentStoreCoordinator;
-
NSManagedObjectModel *managedObjectModel;
-
NSManagedObjectContext *managedObjectContext;
-
}
-
-
@property (nonatomic, retain) IBOutlet UIWindow *window;
-
@property (nonatomic, retain) UINavigationController *navigationController;
-
-
- (IBAction)saveAction:sender; //这个没找到作用...根本就没用到IB
-
-
//还记得吧,nonatomic是因为这个程序是单线程
-
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
-
@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
-
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator
-
*persistentStoreCoordinator;
-
//程序文档目录是主要为了给NSPersistentStoreCoordinator找个存SQLite文件的地方
-
@end
从上面的我们能看出来,该程序是通过一个根Core Data数据管理来管理整个程序的CoreData数据的,接下来看m文件也会对此作更多的理解。
-
#import "LocationsAppDelegate.h"
-
#import "RootViewController.h" //该程序使用了一个根视图控制器,所以导入了这个类
-
@implementation LocationsAppDelegate
-
@synthesize window;
-
@synthesize navigationController;
-
-
- (void)applicationDidFinishLaunching:(UIApplication *)application {
-
//初始化根视图控制器,它是一个列表视图控制器
-
RootViewController *rootViewController = [[RootViewController alloc]
-
initWithStyle:UITableViewStylePlain];
-
-
//通过下面的自定义getter得到CoreData的“被管理对象内容器”
-
NSManagedObjectContext *context = [self managedObjectContext];
-
if (!context) {
-
// 如果getter出错,在这里来排错
-
}
-
rootViewController.managedObjectContext = context;
-
//rootViewController有一个本地“被管理对象内容器”,在这里赋值过去
-
-
UINavigationController *aNavigationController = [[UINavigationController alloc]
-
initWithRootViewController:rootViewController];
-
self.navigationController = aNavigationController;
-
//初始化导航栏,根视图为rootViewController,并指定该导航栏为程序导航栏
-
[window addSubview:[navigationController view]];
-
[window makeKeyAndVisible];
-
-
//由于导航栏retain了根视图,所以在这里可以release掉它了
-
[rootViewController release];
-
//由于self已经retain了导航栏,所以导航栏可以release
-
[aNavigationController release];
-
}
-
-
//applicationWillTerminate: 在程序结束前,Core Data会保存任何对其的更改
-
- (void)applicationWillTerminate:(UIApplication *)application {
-
-
NSError *error;
-
if (managedObjectContext != nil) {
-
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
-
// Handle the error.
-
}
-
}
-
}
-
-
//在得到点击事件后,保存更改
-
- (IBAction)saveAction:(id)sender {
-
-
NSError *error;
-
if (![[self managedObjectContext] save:&error]) {
-
// Handle error
-
}
-
}
-
-
//自定义的managedObjectContext的getter, 它其实是真正在使用的时候的被操作对象
-
- (NSManagedObjectContext *) managedObjectContext {
-
-
//如果已经有这个对象,就直接返回,否则继续
-
if (managedObjectContext != nil) {
-
return managedObjectContext;
-
}
-
-
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
-
if (coordinator != nil) {
-
managedObjectContext = [[NSManagedObjectContext alloc] init];
-
[managedObjectContext setPersistentStoreCoordinator: coordinator];
-
//这里可以看到,“内容管理器”和“数据一致性存储器”的关系,
-
//managedObjectContext需要得到这个“数据一致性存储器”
-
}
-
return managedObjectContext;
-
}
-
-
//自定义的CoreData数据模板的getter,数据模板其实就是一个描述实体与实体的关系
-
//,类似于关系型数据库的关系描述文件
-
- (NSManagedObjectModel *)managedObjectModel {
-
-
if (managedObjectModel != nil) {
-
return managedObjectModel;
-
}
-
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
-
//从本地所有xcdatamodel文件得到这个CoreData数据模板
-
return managedObjectModel;
-
}
-
-
//自定义“数据一致性存储器” persistentStoreCoordinator的getter
-
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
-
-
if (persistentStoreCoordinator != nil) {
-
return persistentStoreCoordinator;
-
}
-
-
//定义一个本地地址到NSURL,用来存储那个SQLite文件
-
[[self applicationDocumentsDirectory]
-
stringByAppendingPathComponent: @"Locations.sqlite"]];
-
-
NSError *error;
-
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
-
initWithManagedObjectModel: [self managedObjectModel]];
-
//从这里可以看出,其实persistentStoreCoordinator需要的不过是一个
-
//存储数据的位置,它是负责管理CoreData如何储存数据的
-
if (![persistentStoreCoordinator
-
addPersistentStoreWithType:NSSQLiteStoreType
-
configuration:nil
-
URL:storeUrl
-
options:nil
-
error:&error]) {
-
// Handle the error.
-
}
-
-
return persistentStoreCoordinator;
-
}
-
-
//返回该程序的档案目录,用来简单使用
-
-
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
-
NSUserDomainMask, YES);
-
return basePath;
-
//我原来的帖子中介绍过,方法其实是一模一样的
-
}
-
-
- (void)dealloc {
-
-
//释放内存
-
[managedObjectContext release];
-
[managedObjectModel release];
-
[persistentStoreCoordinator release];
-
-
[navigationController release];
-
[window release];
-
[super dealloc];
-
}
-
@end
从上面的程序主代理文件可以看出,CoreData的简单使用不过是通过三个组建。
NSManagedObjectModel来描述实体与实体的关系,也就是类似于表和表的关系。
NSManagedObjectContext来得到被储存内容的文件管理器,对数据作直接操作
NSPersistentStoreCoordinator来管理数据的储存位置,储存方法(SQLite)
你对Core Data理解更多了么?
补一下“实体”的概念,实体也就是Entity,在打开xcdatamodel文件的时候,我们可以看到
在这里,这个实体叫“Event”,而实体的参数有“创建日期”,“纬度”,“经度”。也就是说,其实这个实体被使用后,我们可以这样理解,实体就是表名,而参数就是列名,然后整个实体就是一张表。当这个Model描述多个实体的关系的时候,就像是一个关系型数据库一样,虽然苹果说“不是!”