你的位置:首页 > 操作系统

[操作系统]关于Core Data的一些整理(一)


关于Core Data的一些整理(一)

在Xcode7.2中只有Mast-Debug和Single View中可以勾选Use Core Data

如果勾选了Use Core Data,Xcode会自动在AppDelegate中帮你生成Core Data的核心代码,并且自动生成.xcdatamodeld数据文件
 
 1 //Appdelegate.h中 2 #import <UIKit/UIKit.h> 3 #import <CoreData/CoreData.h> 4  5 @interface AppDelegate : UIResponder <UIApplicationDelegate> 6  7 @property (strong, nonatomic) UIWindow *window; 8  9 @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; 10 @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; 11 @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; 12  13 - (void)saveContext; 14 - (NSURL *)applicationDocumentsDirectory; 15  16  17 @end 18  19  20  21 //Appdelegate.m中系统帮助生成的代码 22 - (void)applicationWillTerminate:(UIApplication *)application { 23  // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 24  // Saves changes in the application's managed object context before the application terminates. 25  [self saveContext]; 26 } 27  28 #pragma mark - Core Data stack 29  30 @synthesize managedObjectContext = _managedObjectContext; 31 @synthesize managedObjectModel = _managedObjectModel; 32 @synthesize persistentStoreCoordinator = _persistentStoreCoordinator; 33  34 - (NSURL *)applicationDocumentsDirectory { 35   // The directory the application uses to store the Core Data store file. This code uses a directory named "qq100858433.JMHitList" in the application's documents directory. 36   return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 37 } 38  39 - (NSManagedObjectModel *)managedObjectModel { 40   // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model. 41   if (_managedObjectModel != nil) { 42     return _managedObjectModel; 43   } 44   NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"JMHitList" withExtension:@"momd"]; 45   _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 46   return _managedObjectModel; 47 } 48  49 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 50   // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. 51   if (_persistentStoreCoordinator != nil) { 52     return _persistentStoreCoordinator; 53   } 54    55   // Create the coordinator and store 56    57   _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 58   NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"JMHitList.sqlite"]; 59   NSError *error = nil; 60   NSString *failureReason = @"There was an error creating or loading the application's saved data."; 61   if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 62     // Report any error we got. 63     NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 64     dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data"; 65     dict[NSLocalizedFailureReasonErrorKey] = failureReason; 66     dict[NSUnderlyingErrorKey] = error; 67     error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict]; 68     // Replace this with code to handle the error appropriately. 69     // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 70     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 71     abort(); 72   } 73    74   return _persistentStoreCoordinator; 75 } 76  77  78 - (NSManagedObjectContext *)managedObjectContext { 79   // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) 80   if (_managedObjectContext != nil) { 81     return _managedObjectContext; 82   } 83    84   NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 85   if (!coordinator) { 86     return nil; 87   } 88   _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 89   [_managedObjectContext setPersistentStoreCoordinator:coordinator]; 90   return _managedObjectContext; 91 } 92  93 #pragma mark - Core Data Saving support 94  95 - (void)saveContext { 96   NSManagedObjectContext *managedObjectContext = self.managedObjectContext; 97   if (managedObjectContext != nil) { 98     NSError *error = nil; 99     if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {100       // Replace this implementation with code to handle the error appropriately.101       // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.102       NSLog(@"Unresolved error %@, %@", error, [error userInfo]);103       abort();104     }105   }106 }107 108 @end

假如你在.xcdatamodeld中生成了如下实体和实体属性:

 


那么在VC中获取数据库内容和添加数据库内容的代码如下:
 1  //从Core Data中获得已有数据 2  id appDelegate = [UIApplication sharedApplication].delegate; 3  NSManagedObjectContext *managedContext = [appDelegate managedObjectContext]; 4  NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Person"]; 5  @try { 6   self.people = [NSMutableArray arrayWithArray:[managedContext executeFetchRequest:fetchRequest error:nil]]; 7  } 8  @catch (NSException *exception) { 9   NSLog(@"Could not fetch %@", [exception userInfo]);10  }11  @finally {12   NSLog(@"Fetch Successful");13  }14  15  //为数据库添加实体实例16  id appDelegate = [UIApplication sharedApplication].delegate;17  //NSManagedObjectContext可以看做内存中用来处理managedObjects的暂存器18  NSManagedObjectContext *mangedContext = [appDelegate managedObjectContext];19  //下面两种方法都可以获得Person实体20 // NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:mangedContext];21 // NSManagedObject *person = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:mangedContext];22 // [person setValue:name forKey:@"name"];23  NSManagedObject *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:mangedContext];24  [person setValue:name forKey:@"name"];25  @try {26   [mangedContext save:nil];27   [self.people addObject:person];28  }29  @catch (NSException *exception) {30   NSLog(@"Could not save %@", [exception userInfo]);31  }32  @finally {33   NSLog(@"Save Successfullt!");34  }