Core Data是个好东西,在数据储存操作上速度快,容易操作,是一种类似关系数据库的东西。但是有些不那么好学,那到底Core Data是怎么操作的呢?怎么用呢?怎么来编程呢?我们一起来学习吧,接下来使用苹果提供的实例程序Locations来作分析:
>程序介绍:
右侧是改程序的截图,基本上来说就是通过使用Core Location来得到当时的位置,然后在点击“+”的时候记录下当时的经纬度。通过UITableViewController的功能来添加,编辑,删除等功能。整体程序使用Core Data来储存数据,实体(Entity)为一个位置,包括以下参数:1,时间(收集数据的时间)2,纬度,3,经度
首先我们看看该程序的AppDelegate.h
@interface LocationsAppDelegate : NSObject { 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,readonly) NSManagedObjectContext *managedObjectContext; @property (nonatomic,readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; @property (nonatomic,readonly) NSString *applicationDocumentsDirectory; //程序文档目录是主要为了给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文件 NSURL *storeUrl = [NSURL fileURLWithPath: [[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; } //返回该程序的档案目录,用来简单使用 - (NSString *)applicationDocumentsDirectory { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; return basePath; //我原来的帖子中介绍过,方法其实是一模一样的 } - (void)dealloc { //释放内存 [managedObjectContext release]; [managedObjectModel release]; [persistentStoreCoordinator release]; [navigationController release]; [window release]; [super dealloc]; } @end
从上面的程序主代理文件可以看出,CoreData的简单使用不过是通过三个组建。
NSManagedObjectModel来描述实体与实体的关系,也就是类似于表和表的关系。
NSManagedObjectContext来得到被储存内容的文件管理器,对数据作直接操作
NSPersistentStoreCoordinator来管理数据的储存位置,储存方法(sqlite)
你对Core Data理解更多了么?
- @interfaceLocationsAppDelegate:NSObject{
- UIWindow*window; @H_404_65@ UINavigationController*navigationController;//导航栏
- @H_404_65@ //以下定义了CoreData的三个决定性组建,等后面m文件里面再多介绍
- NSPersistentStoreCoordinator*persistentStoreCoordinator; @H_404_65@ NSManagedObjectModel*managedObjectModel;
- NSManagedObjectContext*managedObjectContext; @H_404_65@ }
- @property(nonatomic,retain)IBOutletUIWindow*window;
- @property(nonatomic,retain)UINavigationController*navigationController; @H_404_65@
- -(IBAction)saveAction:sender;//这个没找到作用...根本就没用到IB
- //还记得吧,nonatomic是因为这个程序是单线程
- readonly)NSManagedObjectModel*managedObjectModel;
- readonly)NSManagedObjectContext*managedObjectContext;
- readonly)NSPersistentStoreCoordinator
- *persistentStoreCoordinator;
- readonly)NSString*applicationDocumentsDirectory;
- //程序文档目录是主要为了给NSPersistentStoreCoordinator找个存sqlite文件的地方 @H_404_65@ @end