网上很多教程包括apple自己的都是从一个core data的模板项目教起, 没有一个怎么在既有的项目上添加core data的方法(也许有,反正我没找到), 下面就是自己研究的添加core data的步骤, 我用的是mac os x 10.6.7, xcode4.0.0
1. 添加core data framework
xcode中选中项目根,在右边的面板中选中targets下面的项目名,再在右边选中 Build Phases, 再选中Link Binary with Libraries, 点加号添加core data 框架
在项目中找一个xx.pch的文件, 加上一行 #import <CoreData/CoreData.h>
2. 在项目的XXXAppDelegate.h 文件中 加入
- @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
- @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
- @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
-
-
- - (void)saveContext;
- - (NSURL *)applicationDocumentsDirectory;
XXXAppDelegate.m文件中加入
- @synthesize managedObjectContext=__managedObjectContext;
-
- @synthesize managedObjectModel=__managedObjectModel;
-
- @synthesize persistentStoreCoordinator=__persistentStoreCoordinator;
-
-
-
-
- - (void)saveContext
- {
- NSError *error = nil;
- NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
- if (managedObjectContext != nil)
- {
- if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
- {
-
-
-
-
-
- NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
- abort();
- }
- }
- }
-
-
- #pragma mark - Core Data stack
-
-
-
-
-
- - (NSManagedObjectContext *)managedObjectContext
- {
- if (__managedObjectContext != nil)
- {
- return __managedObjectContext;
- }
-
- NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
- if (coordinator != nil)
- {
- __managedObjectContext = [[NSManagedObjectContext alloc] init];
- [__managedObjectContext setPersistentStoreCoordinator:coordinator];
- }
- return __managedObjectContext;
- }
-
-
-
-
-
- - (NSManagedObjectModel *)managedObjectModel
- {
- if (__managedObjectModel != nil)
- {
- return __managedObjectModel;
- }
-
- NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"lich" withExtension:@"momd"];
- __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
- return __managedObjectModel;
- }
-
-
-
-
-
- - (NSPersistentStoreCoordinator *)persistentStoreCoordinator
- {
- if (__persistentStoreCoordinator != nil)
- {
- return __persistentStoreCoordinator;
- }
-
- NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"lich.sqlite"];
-
- NSError *error = nil;
- __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
- if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
- {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
- abort();
- }
-
- return __persistentStoreCoordinator;
- }
-
- #pragma mark - Application's Documents directory
-
-
-
-
- - (NSURL *)applicationDocumentsDirectory
- {
- return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
- }
因为加入了新的属性,自己记得去release
这里比较奇怪的一点是RLForResource:@"lich" withExtension:@"momd"]; 扩展名是momd 而不是xcdatamodeld,原因可能是:
xcdatamodeld文件是编译前的状态,这个文件在编译时会被转为momd文件被拷贝到App的main bundle里
上面很多代码是从core data模板项目里copy过来的,大致的意思就是先建立一个managedObjectModel,
然后根据 managedObjectModel 建立 persistentStoreCoordinator
然后根据 persistentStoreCoordinator 建立 managedObjectContext
3. 然后是把managedObjectContext传给真正要使用数据的 viewcontroller
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- {
-
- [self.window makeKeyAndVisible];
- NSManagedObjectContext *context = [self managedObjectContext];
- NSArray *array = self.tabBarController.viewControllers;
- for (UINavigationController *navi in array) {
- RootView *rv = (RootView *)navi.topViewController;
- rv.context = context;
- }
我开始不明白为什么要在XXXAppDelegate中建立managedObjectContext 而不是在viewcontroller中,那样就不用传来传去了啊
也许是view对象有时候会被销毁吧
转自:http://www.iteye.com/topic/1017633