/ Published in: iPhone
Expand |
Embed | Plain Text
Copy this code and paste it in your HTML
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æ˜¯å› ä¸ºè¿™ä¸ªç¨‹åºæ˜¯å•çº¿ç¨‹ *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的“被管ç†å¯¹è±¡å†…容器†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, 它其实是真æ£åœ¨ä½¿ç”¨çš„时候的被æ“作对象 //如果已ç»æœ‰è¿™ä¸ªå¯¹è±¡ï¼Œå°±ç›´æŽ¥è¿”回,å¦åˆ™ç»§ç» if (managedObjectContext != nil) { return managedObjectContext; } if (coordinator != nil) { [managedObjectContext setPersistentStoreCoordinator: coordinator]; //这里å¯ä»¥çœ‹åˆ°ï¼Œâ€œå†…容管ç†å™¨â€å’Œâ€œæ•°æ®ä¸€è‡´æ€§å˜å‚¨å™¨â€çš„关系, //managedObjectContext需è¦å¾—到这个“数æ®ä¸€è‡´æ€§å˜å‚¨å™¨â€ } return managedObjectContext; } //自定义的CoreDataæ•°æ®æ¨¡æ¿çš„getter,数æ®æ¨¡æ¿å…¶å®žå°±æ˜¯ä¸€ä¸ªæ述实体与实体的关系 //,类似于关系型数æ®åº“的关系æ述文件 if (managedObjectModel != nil) { return managedObjectModel; } //从本地所有xcdatamodel文件得到这个CoreDataæ•°æ®æ¨¡æ¿ return managedObjectModel; } //自定义“数æ®ä¸€è‡´æ€§å˜å‚¨å™¨â€ persistentStoreCoordinatorçš„getter if (persistentStoreCoordinator != nil) { return persistentStoreCoordinator; } //定义一个本地地å€åˆ°NSURL,用æ¥å˜å‚¨é‚£ä¸ªSQLite文件 [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Locations.sqlite"]]; NSError *error; initWithManagedObjectModel: [self managedObjectModel]]; //从这里å¯ä»¥çœ‹å‡ºï¼Œå…¶å®žpersistentStoreCoordinator需è¦çš„ä¸è¿‡æ˜¯ä¸€ä¸ª //å˜å‚¨æ•°æ®çš„ä½ç½®ï¼Œå®ƒæ˜¯è´Ÿè´£ç®¡ç†CoreData如何储å˜æ•°æ®çš„ if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) { // Handle the error. } return persistentStoreCoordinator; } //返回该程åºçš„档案目录,用æ¥ç®€å•ä½¿ç”¨ NSUserDomainMask, YES); return basePath; //我原æ¥çš„帖åä¸ä»‹ç»è¿‡ï¼Œæ–¹æ³•å…¶å®žæ˜¯ä¸€æ¨¡ä¸€æ ·çš„ } - (void)dealloc { //é‡Šæ”¾å†…å˜ [managedObjectContext release]; [managedObjectModel release]; [persistentStoreCoordinator release]; [navigationController release]; [window release]; [super dealloc]; } @end 从上é¢çš„程åºä¸»ä»£ç†æ–‡ä»¶å¯ä»¥çœ‹å‡ºï¼ŒCoreData的简å•ä½¿ç”¨ä¸è¿‡æ˜¯é€šè¿‡ä¸‰ä¸ªç»„建。 NSManagedObjectModelæ¥æ述实体与实体的关系,也就是类似于表和表的关系。 NSManagedObjectContextæ¥å¾—到被储å˜å†…容的文件管ç†å™¨ï¼Œå¯¹æ•°æ®ä½œç›´æŽ¥æ“作
URL: http://c.gzl.name/archives/393