coreData 使用分析

Core Data是个好东西,在数据储存操作上速度快,容易操作,是一种类似关系数据库的东西。但是有些不那么好学,那到底Core Data是怎么操作的呢?怎么用呢?怎么来编程呢?我们一起来 学习 吧,接下来 使用 苹果 提供的实例程序Locations来作分析:
>程序介绍:
右侧是改程序的截图,基本上来说就是通过使用Core Location来得到当时的位置,然后在点击“+”的时候记录下当时的经纬度。通过UITableViewController的功能来添加,编辑,删除等功能。整体程序使用Core Data来储存数据,实体(Entity)为一个位置,包括以下参数:1,时间(收集数据的时间)2,纬度,3,经度
首先我们看看该程序的AppDelegate.h
[pre] view plain

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

[/pre]

从上面的我们能看出来,该程序是通过一个根Core Data数据管理来管理整个程序的 CoreData 数据的,接下来看m文件也会对此作更多的理解。
[pre] view plain

  1. #import "LocationsAppDelegate.h"
  2. #import "RootViewController.h" //该程序使用了一个根视图控制器,所以导入了这个类@implementation LocationsAppDelegate  
  3. @synthesize window;  @synthesize navigationController;  
  4. - (void)applicationDidFinishLaunching:(UIApplication *)application {  
  5.     //初始化根视图控制器,它是一个列表视图控制器    RootViewController *rootViewController = [[RootViewController alloc]  
  6.              initWithStyle:UITableViewStylePlain];  
  7.     //通过下面的自定义getter得到CoreData的“被管理对象内容器”    NSManagedObjectContext *context = [self managedObjectContext];  
  8.     if (!context) {          // 如果getter出错,在这里来排错
  9.     }      rootViewController.managedObjectContext = context;  
  10.     //rootViewController有一个本地“被管理对象内容器”,在这里赋值过去
  11.     UINavigationController *aNavigationController = [[UINavigationController alloc]               initWithRootViewController:rootViewController];  
  12.     self.navigationController = aNavigationController;      //初始化导航栏,根视图为rootViewController,并指定该导航栏为程序导航栏
  13.     [window addSubview:[navigationController view]];      [window makeKeyAndVisible];  
  14.     //由于导航栏retain了根视图,所以在这里可以release掉它了
  15.     [rootViewController release];      //由于self已经retain了导航栏,所以导航栏可以release
  16.     [aNavigationController release];  }  
  17. //applicationWillTerminate: 在程序结束前,Core Data会保存任何对其的更改
  18. - (void)applicationWillTerminate:(UIApplication *)application {  
  19.     NSError *error;      if (managedObjectContext != nil) {  
  20.         if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {              // Handle the error.
  21.         }      }  
  22. }  
  23. //在得到点击事件后,保存更改- (IBAction)saveAction:(id)sender {  
  24.     NSError *error;  
  25.     if (![[self managedObjectContext] save:&error]) {          // Handle error
  26.     }  }  
  27. //自定义的managedObjectContext的getter, 它其实是真正在使用的时候的被操作对象
  28. - (NSManagedObjectContext *) managedObjectContext {  
  29.     //如果已经有这个对象,就直接返回,否则继续    if (managedObjectContext != nil) {  
  30.         return managedObjectContext;      }  
  31.     NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];  
  32.     if (coordinator != nil) {          managedObjectContext = [[NSManagedObjectContext alloc] init];  
  33.         [managedObjectContext setPersistentStoreCoordinator: coordinator];         //这里可以看到,“内容管理器”和“数据一致性存储器”的关系,
  34.        //managedObjectContext需要得到这个“数据一致性存储器”    }  
  35.     return managedObjectContext;  }  
  36. //自定义的CoreData数据模板的getter,数据模板其实就是一个描述实体与实体的关系
  37. //,类似于关系型数据库的关系描述文件- (NSManagedObjectModel *)managedObjectModel {  
  38.     if (managedObjectModel != nil) {  
  39.         return managedObjectModel;      }  
  40.     managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];      //从本地所有xcda*****odel文件得到这个CoreData数据模板
  41.     return managedObjectModel;  }  
  42. //自定义“数据一致性存储器” persistentStoreCoordinator的getter
  43. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {  
  44.     if (persistentStoreCoordinator != nil) {          return persistentStoreCoordinator;  
  45.     }  
  46.     //定义一个本地地址到NSURL,用来存储那个SQLite文件    NSURL *storeUrl = [NSURL fileURLWithPath:  
  47.             [[self applicationDocumentsDirectory]                              stringByAppendingPathComponent: @"Locations.sqlite"]];  
  48.     NSError *error;  
  49.     persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]              initWithManagedObjectModel: [self managedObjectModel]];  
  50.     //从这里可以看出,其实persistentStoreCoordinator需要的不过是一个    //存储数据的位置,它是负责管理CoreData如何储存数据的
  51.     if (![persistentStoreCoordinator          addPersistentStoreWithType:NSSQLiteStoreType  
  52.         configuration:nil          URL:storeUrl  
  53.         options:nil          error:&error]) {  
  54.         // Handle the error.    }      
  55.     return persistentStoreCoordinator;  
  56. }  
  57. //返回该程序的档案目录,用来简单使用- (NSString *)applicationDocumentsDirectory {  
  58.     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  
  59.                             NSUserDomainMask, YES);      NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;  
  60.     return basePath;      //我原来的帖子中介绍过,方法其实是一模一样的
  61. }  
  62. - (void)dealloc {  
  63.     //释放内存    [managedObjectContext release];  
  64.     [managedObjectModel release];      [persistentStoreCoordinator release];  
  65.     [navigationController release];  
  66.     [window release];      [super dealloc];  
  67. }  @end  

[/pre]

从上面的程序主代理文件可以看出, CoreData 的简单使用不过是通过三个组建。
NSManagedObjectModel来描述实体与实体的关系,也就是类似于表和表的关系。
NSManagedObjectContext来得到被储存内容的文件管理器,对数据作直接操作
NSPersistentStoreCoordinator来管理数据的储存位置,储存方法(SQLite)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值