Revision: 25498
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at April 1, 2010 02:16 by iswear_wxp
Initial Code
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)
Initial URL
http://c.gzl.name/archives/393
Initial Description
Initial Title
CoreData实例分æžå¦ä¹ (1)
Initial Tags
Initial Language
iPhone