CoreData实例分析学习(1)

来源:互联网 发布:佳博打印软件 编辑:程序博客网 时间:2024/04/29 15:16

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, retain, readonly) NSManagedObjectContext *managedObjectContext;@property (nonatomic, retain, 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理解更多了么?

 

 

[c-sharp] view plaincopy
  1. @interface LocationsAppDelegate : NSObject  {  
  2.     UIWindow *window;  
  3.     UINavigationController *navigationController; //导航栏  
  4.    
  5.     //以下定义了Core Data的三个决定性组建,等后面m文件里面再多介绍  
  6.     NSPersistentStoreCoordinator *persistentStoreCoordinator;  
  7.     NSManagedObjectModel *managedObjectModel;  
  8.     NSManagedObjectContext *managedObjectContext;  
  9. }  
  10.    
  11. @property (nonatomic, retain) IBOutlet UIWindow *window;  
  12. @property (nonatomic, retain) UINavigationController *navigationController;  
  13.    
  14. - (IBAction)saveAction:sender; //这个没找到作用...根本就没用到IB  
  15.    
  16. //还记得吧,nonatomic是因为这个程序是单线程  
  17. @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;  
  18. @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;  
  19. @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator  
  20.                               *persistentStoreCoordinator;  
  21. @property (nonatomic, readonly) NSString *applicationDocumentsDirectory;  
  22. //程序文档目录是主要为了给NSPersistentStoreCoordinator找个存SQLite文件的地方  
  23. @end  
 


原创粉丝点击